---
title: "Create training content (bulk insert)"
method: POST
path: "/learning/lms-integrations/{provider-identifier}/training-content"
tags: ["Provider integrations"]
---

# Create training content (bulk insert)

`POST /learning/lms-integrations/{provider-identifier}/training-content`

Creates one or more training content items for the integration in a single request (up to 500 items per call).

Each item requires a unique `/trainingContent/externalIdentifier` and a `/trainingContent/title`. All other fields are optional. If the same `externalIdentifier` appears more than once in a request, only the last occurrence is used.

Returns `200 OK` with a `success` array of processed identifiers and an `errors` array for any items that failed. Returns `403` with no body if the LMS feature is disabled for the company.

**Before using this endpoint:**
<ul>
  <li>Create an integration first using <a href="/reference/post_learning-lms-integrations" target="_blank">Create integration</a> — the `provider-identifier` path parameter must match an active integration.</li>
  <li>Each item must include `/trainingContent/externalIdentifier` (unique per provider) and `/trainingContent/title`. All other fields are optional.</li>
  <li>The `externalIdentifier` is your stable, idempotency key for the content row — use the same value to update or archive the item later.</li>
</ul>

**Testing notes:** Open the **Examples** panel and select a **Request Example** to inspect the body parameters. The response body contains a `success` array of processed identifiers and an `errors` array for any failures.

## Path parameters

- `provider-identifier` string, required

## Request body

- PartnerContentBulkWriteRequest — Bulk training content write request. Each element of `items` is a JSON object whose keys are field IDs under `/trainingContent/`.
  - `items` TrainingContentItemFields[], required — Content rows. Maximum count is enforced by the service (default 500).
    - `/trainingContent/externalIdentifier` string — External idempotency key for the content row.
    - `/trainingContent/title` string — Title of the training content.
    - `/trainingContent/description` string — Description text.
    - `/trainingContent/sourceLink` string — URL to the content at the provider.
    - `/trainingContent/thumbnail` string — Thumbnail image URL.
    - `/trainingContent/duration` integer — Duration in seconds.
    - `/trainingContent/language` string — Language code for the training content. To obtain the available language codes, call the <a href="https://apidocs.hibob.com/reference/get_company-named-lists-listname" target="_blank">Get all company lists Metadata API</a> with `languages` in the listname path parameter.
    - `/trainingContent/category` string — Optional. The category label (display name) to assign to the training content. If the name matches an existing entry in the Bob's categories list, that category is used. If no match is found, a new category is created automatically. To view existing categories, call the <a href="https://apidocs.hibob.com/reference/get_company-named-lists-listname" target="_blank">Get all company lists Metadata API</a> with `trainingContentCategories` in the listname path parameter.
    - `/trainingContent/learningGoals` string — Learning goals or outcomes text.
    - `/trainingContent/publishDate` string — Publish date-time (ISO-8601 string as accepted by the mapper).
    - `/trainingContent/createdAt` string — The time the content was last updated on the provider's side (ISO-8601 date-time string). Used for delta sync scenarios to determine whether a content item has changed since the last sync.
    - `/trainingContent/intendedFor` string — Free-text description of the intended audience (for example, "All employees" or "Managers").

## Response `200`

Success — processing result with per-item successes and failures

- PartnerContentBulkResponse — Bulk operation outcome from `PartnerContentBulkResponse`.
  - `success` string[] — External identifiers that were processed successfully.
  - `errors` PartnerContentErrorItem[] — Per-item failures with external id and message.
    - `externalIdentifier` string, required — External identifier of the failing item.
    - `message` string, required — Failure reason (for example validation or downstream error).

## Other responses

- `400` — Bad request — for example batch size exceeded
- `401` — Authentication failed
- `403` — Forbidden — feature disabled or missing permissions
- `404` — Not found — unknown integration
- `422` — Unprocessable entity — invalid item(s)
- `429` — Rate limit exceeded
- `500` — Internal server error

---

[API](https://skmtc.net/hibob/apis/employee-data-api.md) · [All operations](https://skmtc.net/hibob/apis/employee-data-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/hibob/employee-data-api/revisions/0781ebbdda91/schema)
