Batch Create Asset Library Items
Create up to 200 Asset Library items in one request. Ingestible types are queued.
Creates up to 200 Asset Library items in one request. Every ingestible item (image,
resource_file, scorm, xapi) is queued and starts as processingStatus: "pending". Poll
Get Asset Library Item for each returned ID.
https://example.thoughtindustries.com/v3/assetLibraryItems/batchThis endpoint is served by the v3 API. Its full path is
https://{instance}.thoughtindustries.com/v3/assetLibraryItems/batch, not the/incoming/v2base URL used by the rest of this reference. Use the full URL shown in the examples below.
Hosted URL only. There is no multipart upload. Each item's
sourceUrlis fetched later by a background worker. Do not point those URLs at internal, loopback, or private-network addresses.
Example request
curl -X POST "https://{instance}.thoughtindustries.com/v3/assetLibraryItems/batch" \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"items": [
{
"title": "Safety PDF",
"assetType": "resource_file",
"sourceUrl": "https://example.com/files/safety.pdf",
"fileName": "safety.pdf"
},
{
"title": "Orientation SCORM",
"assetType": "scorm",
"sourceUrl": "https://example.com/packages/orientation.zip",
"fileName": "orientation.zip"
}
]
}'Parameters
Requires the centrallibrary.new permission. A company API key satisfies this.
| Name | Type | Required | Location | Description |
|---|---|---|---|---|
items | object[] | Yes | body | One to 200 create payloads. Each object uses the same fields as Create Asset Library Item. |
Each entry in items:
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Display title. Maximum 500 characters. |
assetType | string | Yes | One of image, wysiwyg, resource_file, scorm, xapi. |
sourceUrl | url | Yes | Hosted HTTP or HTTPS URL. |
description | string | No | Maximum 5000 characters. |
fileName | string | No | Original file name. Maximum 500 characters. |
tagIds | uuid[] | No | Tag IDs to associate. |
imageAltText | string | No | Image only. |
imageCaption | string | No | Image only. |
imageLink | url | No | Image only. |
imageNewTab | boolean | No | Image only. |
imageTitle | string | No | Image only. |
Unlike single create, images and PDFs are also asynchronous here. The batch path queues every
ingestible type so the request does not time out at 200 files. A wysiwyg entry is stored
immediately with processingStatus: "ready" and body: null.
Image-specific fields on a non-image entry fail the entire request before any row is written.
Example response (202)
Note the data wrapper — v3 endpoints nest their payload under data. Status is 202 when any
returned item has processingStatus: "pending". A batch of only wysiwyg items returns 201.
{
"data": [
{
"id": "11111111-2222-3333-4444-555555555555",
"title": "Safety PDF",
"assetType": "resource_file",
"description": null,
"body": null,
"contentType": null,
"fileName": "safety.pdf",
"tagIds": [],
"version": 1,
"locationIds": [],
"imageAltText": null,
"imageCaption": null,
"imageLink": null,
"imageNewTab": false,
"imageTitle": null,
"isNew": true,
"processingStatus": "pending",
"createdAt": "2026-08-26T20:19:55.000Z",
"updatedAt": "2026-08-26T20:19:55.000Z"
},
{
"id": "66666666-7777-8888-9999-000000000000",
"title": "Orientation SCORM",
"assetType": "scorm",
"description": null,
"body": null,
"contentType": null,
"fileName": "orientation.zip",
"tagIds": [],
"version": 1,
"locationIds": [],
"imageAltText": null,
"imageCaption": null,
"imageLink": null,
"imageNewTab": false,
"imageTitle": null,
"isNew": true,
"processingStatus": "pending",
"createdAt": "2026-08-26T20:19:55.000Z",
"updatedAt": "2026-08-26T20:19:55.000Z"
}
]
}Capture every id from data[]. There is no batch status endpoint — poll each item. If the
queue cannot accept the jobs, those ingestible items come back as processingStatus: "failed" in
this same 200/202 body. Non-ingestible (wysiwyg) items in that batch are still created.
Errors
Image fields on a non-image entry return 422 with code: "IMAGE_FIELDS_NOT_ALLOWED" and
message: "Image-specific fields can only be set on assets with type \"image\"."
An empty items array, more than 200 entries, or a malformed field on any entry returns 400 with
code: "BAD_REQUEST" and category: "CLIENT_ERROR". message names the field. timestamp,
statusCode, and metadata.errors are present on the same body; see
List Asset Library Items for the shape. Nothing is created.
A missing or invalid API key returns 401 with code: "UNAUTHENTICATED". A manager session
without centrallibrary.new returns 403 with code: "FORBIDDEN" and
message: "Insufficient permissions: centrallibrary.new required".
Rate limit
10 requests per 60 seconds, counted per instance. This limit is specific to this endpoint and is
independent of the per-family rate limits that apply to /incoming/v2 endpoints.