---
title: "Create Training Content [Batch]"
method: POST
path: "/apiHub/learningManagementSystem/v1/companies/{companyId}/batchedContent"
tags: ["Training Content"]
---

# Create Training Content [Batch]

`POST /apiHub/learningManagementSystem/v1/companies/{companyId}/batchedContent`

> 🚧 Partner Restricted
> All LMS API endpoints are restricted to LMS providers that have signed a Paylocity technology partnership agreement.
> [Please reach out to our team](https://www.paylocity.com/contact/partner-form/) if you would like to discuss partnership opportunities.

**Summary Description**

Creates a bulk upload request for multiple training content items and returns a pre-signed upload URL for a single ZIP payload.

**Workflow**

1. POST metadata for all content items and the ZIP file details.
2. Receive `bulkUploadId` + `uploadUrl` + expiration timestamp.
3. Upload the ZIP file with the returned HTTP method (typically `PUT`).
4. Poll the status endpoint using `bulkUploadId` until a terminal status is returned.

**Use Cases**

- Partner wants to upload multiple training courses in a single operation.
- Partner needs to efficiently add a library of content to their LMS catalog.

**Validation Rules**

- `contentItems` is required and must contain between 1 and 100 items
- Each `contentItem` must follow the same validation rules as single content upload
- `zipFileDetails` is required
- `zipFileDetails.contentType` must be `application/zip`
- `zipFileDetails.length` must be greater than 0 and less than or equal to 2 GB (2147483648 bytes)
- `contentItems[].training` is optional; when provided, the `name` field is required and the `description` field is optional. Supplying the training object places the content in the **On-Demand Trainings** area of LMS. If the training object is omitted, the content is stored in the **Company Content Library**.

**Test Mode**

When `testMode=true`, the endpoint returns a mocked accepted response and does not create a persistent bulk upload record.

## Path parameters

- `companyId` string, required

## Headers

- `testMode` boolean

## Request body

- BulkUploadRequestDto — Request DTO for bulk upload of training content items.
  - `contentItems` MediaContentDto[], required — Gets or sets the list of media content items to be uploaded. Required. Min 1, Max 100 items per bulk upload.
    - `title` string, nullable — Title of the media content. Required. Max length 255. Validation: Must not be null or empty, max length 255.
    - `description` string, nullable — Description of the media content. Optional. Max length 2000. Validation: If provided, max length 2000.
    - `contentType` 'None' | 'SCORM' | 'Video' | 'File' | 'Url' | 'VideoUpload' | 'Quiz' | 'VideoHub' | 'Audio' | 'Text' — Content type of the media content. Required. Allowed values: File, Url, SCORM, Video. Validation: Must be one of the allowed values.
    - `url` string, nullable — If externally hosted, the URL to access the content. Required if ContentType is Url. Max length 2000. Validation: Required if ContentType is Url, must be a valid URL, max length 2000.
    - `fileDetails` FileDetailsDto
      - `name` string, nullable — Name of the file.
      - `length` integer — Length of the file in bytes.
      - `contentType` string, nullable — MIME type of the file (e.g., video/mp4, image/jpeg).
    - `training` ExternalContentTrainingDto — Optional training metadata determines content placement. Providing it places the content in the LMS On-Demand Trainings area; omitting it keeps the content in the company content library.
      - `name` string, nullable — Training name.
    - `featurePackKey` string, nullable — Optional: Identifies content as part of a specific feature pack
  - `zipFileDetails` FileDetailsDto, required
    - `name` string, nullable — Name of the file.
    - `length` integer — Length of the file in bytes.
    - `contentType` string, nullable — MIME type of the file (e.g., video/mp4, image/jpeg).

## Response `202`

Accepted - Bulk upload request has been accepted.

- BulkUploadResponseDto — Response DTO for bulk upload initiation.
  - `bulkUploadId` string, nullable — Gets or sets the unique identifier for the bulk upload operation. Use this ID to check status.
  - `message` string, nullable — Gets or sets the descriptive message about the bulk upload request.
  - `uploadUrl` string, nullable — Gets or sets the pre-signed URL where the partner should upload the ZIP file containing all content files.
  - `httpMethod` string, nullable — Gets or sets the HTTP method to use when uploading the file (typically PUT).
  - `expiresAt` string, date-time — Gets or sets the ISO 8601 timestamp when the upload URL expires.
  - `totalItems` integer — Gets or sets the total number of content items in the bulk upload.
  - `status` 'Pending' | 'Downloading' | 'Downloaded' | 'Processing' | 'Uploading' | 'Created' | 'PartialCreated' | 'CreationFailed' | 'Completed' | 'PartialSuccess' | 'Failed' — Gets or sets the current status of the bulk upload operation.

## Other responses

- `400` — Bad Request - Returns the details of the error.
- `415` — Unsupported Media Type - Returns the details of the error.

---

[API](https://skmtc.net/paylocity/apis/assessments-api.md) · [All operations](https://skmtc.net/paylocity/apis/assessments-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/paylocity/assessments-api/revisions/dd22ab229153/schema)
