Skip to main content
https://.thoughtindustries.com

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.

POSThttps://example.thoughtindustries.com/v3/assetLibraryItems/batch

This endpoint is served by the v3 API. Its full path is https://{instance}.thoughtindustries.com/v3/assetLibraryItems/batch, not the /incoming/v2 base 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 sourceUrl is 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.

NameTypeRequiredLocationDescription
itemsobject[]YesbodyOne to 200 create payloads. Each object uses the same fields as Create Asset Library Item.

Each entry in items:

FieldTypeRequiredDescription
titlestringYesDisplay title. Maximum 500 characters.
assetTypestringYesOne of image, wysiwyg, resource_file, scorm, xapi.
sourceUrlurlYesHosted HTTP or HTTPS URL.
descriptionstringNoMaximum 5000 characters.
fileNamestringNoOriginal file name. Maximum 500 characters.
tagIdsuuid[]NoTag IDs to associate.
imageAltTextstringNoImage only.
imageCaptionstringNoImage only.
imageLinkurlNoImage only.
imageNewTabbooleanNoImage only.
imageTitlestringNoImage 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.