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

List Asset Library Items

Paginated list of Asset Library items, filterable by type, title, tags, and updatedAfter.

Returns a paginated list of Asset Library items for the authenticated instance. Use this to discover item IDs before attaching assets in the admin UI, or to resume a migration with updatedAfter.

GEThttps://example.thoughtindustries.com/v3/assetLibraryItems

This endpoint is served by the v3 API. Its full path is https://{instance}.thoughtindustries.com/v3/assetLibraryItems, not the /incoming/v2 base URL used by the rest of this reference. Use the full URL shown in the examples below.

Example request

curl "https://{instance}.thoughtindustries.com/v3/assetLibraryItems?assetType=scorm&limit=50" \
  -H 'Authorization: Bearer YOUR_API_KEY'

Example request — resume after a checkpoint

curl "https://{instance}.thoughtindustries.com/v3/assetLibraryItems?updatedAfter=2026-08-01T00:00:00.000Z&limit=50" \
  -H 'Authorization: Bearer YOUR_API_KEY'

Example request — filter by tags

Repeat tagIds once per UUID. Do not send a JSON array or a comma-separated list.

curl "https://{instance}.thoughtindustries.com/v3/assetLibraryItems?tagIds=11111111-2222-3333-4444-555555555555&tagIds=66666666-7777-8888-9999-000000000000" \
  -H 'Authorization: Bearer YOUR_API_KEY'

Parameters

Requires a manager session or a company API key. List and get do not require an additional centrallibrary permission.

NameTypeRequiredLocationDescription
assetTypestringNoqueryFilter to one type. Accepted values: image, wysiwyg, resource_file, scorm, xapi, certificateTemplate.
searchstringNoqueryCase-insensitive substring match on title. Maximum 500 characters. % and _ are treated as literal characters.
tagIdsuuid[]NoqueryKeep items whose tag list overlaps this set. Repeat the query param once per ID (tagIds=uuid1&tagIds=uuid2). A JSON array or a comma-separated list returns 400.
updatedAfterstringNoqueryISO 8601 timestamp. Only items with updatedAt strictly after this instant are returned.
cursorstringNoqueryOpaque cursor from a previous nextCursor. Echo it back; do not construct it.
limitintegerNoqueryPage size. Default 50, minimum 1, maximum 200.

Soft-deleted items and prior revisions are never returned. Results are tenant-scoped to the authenticated instance and ordered by updatedAt descending, then id descending.

certificateTemplate is list-only — you can filter to those items here, but create and update reject that type.

Example response

Note the data wrapper — v3 endpoints nest their payload under data.

{
  "data": {
    "items": [
      {
        "id": "443d8182-d461-4568-a777-918ca729fd85",
        "title": "Test SCORM Asset",
        "assetType": "scorm",
        "description": "A test SCORM package for API validation",
        "body": "3a131ac3-1a74-420d-b4da-ae10b18b2c68/443d8182-d461-4568-a777-918ca729fd85-1787775595630.zip",
        "contentType": "SCORM20042NDEDITION",
        "fileName": "golf-scorm-2004.zip",
        "tagIds": [],
        "version": 1,
        "locationIds": [],
        "imageAltText": null,
        "imageCaption": null,
        "imageLink": null,
        "imageNewTab": false,
        "imageTitle": null,
        "isNew": true,
        "processingStatus": "ready",
        "createdAt": "2026-08-26T20:19:55.000Z",
        "updatedAt": "2026-08-26T20:20:01.000Z"
      }
    ],
    "nextCursor": null
  }
}

Response fields

FieldTypeDescription
data.itemsobject[]The current page of items.
data.items[].iduuidAsset Library item ID.
data.items[].titlestring | nullDisplay title.
data.items[].assetTypestring | nullStored type. One of the filter values above.
data.items[].descriptionstring | nullOptional description.
data.items[].bodystring | nullStored file location after ingest (S3 key or URL). null until processing finishes, and always null for wysiwyg.
data.items[].contentTypestring | nullMIME type, or a SCORM learning-standard label such as SCORM20042NDEDITION.
data.items[].fileNamestring | nullOriginal file name.
data.items[].tagIdsuuid[]Associated tag IDs.
data.items[].versioninteger | nullAsset version. New items start at 1.
data.items[].locationIdsuuid[]Locations linked to the item.
data.items[].imageAltTextstring | nullImage alt text. Meaningful only when assetType is image.
data.items[].imageCaptionstring | nullImage caption.
data.items[].imageLinkstring | nullImage click-through URL.
data.items[].imageNewTabbooleanWhether the image link opens in a new tab.
data.items[].imageTitlestring | nullImage title attribute.
data.items[].isNewbooleanAuthor-side "new asset" badge. true on newly created items.
data.items[].processingStatusstringpending, processing, ready, or failed.
data.items[].createdAtdatetimeCreation timestamp (ISO 8601).
data.items[].updatedAtdatetimeLast update timestamp (ISO 8601).
data.nextCursorstring | nullPass as cursor to fetch the next page. null when there are no more results.

Pagination

This endpoint uses cursor pagination, not page numbers. When nextCursor is present, request the next page with the same filters and cursor=<nextCursor>. Changing filters mid-walk will skip or repeat rows.

Errors

An invalid query value returns 400 with code: "BAD_REQUEST" and category: "CLIENT_ERROR". message names the field. When more than one constraint fails, the messages are joined with ; . metadata.errors is the same list as an array — use it when you need each constraint separately.

Inputmessage
assetType=bogusassetType must be one of the following values: image, wysiwyg, resource_file, scorm, xapi, certificateTemplate
tagIds=not-a-uuideach value in tagIds must be a UUID
limit=abclimit must not be greater than 200; limit must not be less than 1; limit must be an integer number
{
  "code": "BAD_REQUEST",
  "message": "each value in tagIds must be a UUID",
  "category": "CLIENT_ERROR",
  "timestamp": "2026-09-10T12:09:23.988Z",
  "statusCode": 400,
  "metadata": {
    "errors": ["each value in tagIds must be a UUID"]
  }
}
FieldTypeDescription
codestringBAD_REQUEST for query validation.
messagestringHuman-readable reason. Names the field. Multiple constraints are joined with ; .
categorystringCLIENT_ERROR.
timestampdatetimeWhen the instance built this body (ISO 8601).
statusCodeintegerHTTP status, 400 here.
metadata.errorsstring[]Present when ValidationPipe rejected one or more constraints. Same strings as message, unjoined.

An unrecognized query property is also 400 (forbidNonWhitelisted). A missing or invalid API key returns 401 with code: "UNAUTHENTICATED".

Rate limit

200 requests per 60 seconds, counted per instance. This limit is specific to the Asset Library controller and is independent of the per-family rate limits that apply to /incoming/v2 endpoints.