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.
https://example.thoughtindustries.com/v3/assetLibraryItemsThis endpoint is served by the v3 API. Its full path is
https://{instance}.thoughtindustries.com/v3/assetLibraryItems, not the/incoming/v2base 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.
| Name | Type | Required | Location | Description |
|---|---|---|---|---|
assetType | string | No | query | Filter to one type. Accepted values: image, wysiwyg, resource_file, scorm, xapi, certificateTemplate. |
search | string | No | query | Case-insensitive substring match on title. Maximum 500 characters. % and _ are treated as literal characters. |
tagIds | uuid[] | No | query | Keep 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. |
updatedAfter | string | No | query | ISO 8601 timestamp. Only items with updatedAt strictly after this instant are returned. |
cursor | string | No | query | Opaque cursor from a previous nextCursor. Echo it back; do not construct it. |
limit | integer | No | query | Page 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
| Field | Type | Description |
|---|---|---|
data.items | object[] | The current page of items. |
data.items[].id | uuid | Asset Library item ID. |
data.items[].title | string | null | Display title. |
data.items[].assetType | string | null | Stored type. One of the filter values above. |
data.items[].description | string | null | Optional description. |
data.items[].body | string | null | Stored file location after ingest (S3 key or URL). null until processing finishes, and always null for wysiwyg. |
data.items[].contentType | string | null | MIME type, or a SCORM learning-standard label such as SCORM20042NDEDITION. |
data.items[].fileName | string | null | Original file name. |
data.items[].tagIds | uuid[] | Associated tag IDs. |
data.items[].version | integer | null | Asset version. New items start at 1. |
data.items[].locationIds | uuid[] | Locations linked to the item. |
data.items[].imageAltText | string | null | Image alt text. Meaningful only when assetType is image. |
data.items[].imageCaption | string | null | Image caption. |
data.items[].imageLink | string | null | Image click-through URL. |
data.items[].imageNewTab | boolean | Whether the image link opens in a new tab. |
data.items[].imageTitle | string | null | Image title attribute. |
data.items[].isNew | boolean | Author-side "new asset" badge. true on newly created items. |
data.items[].processingStatus | string | pending, processing, ready, or failed. |
data.items[].createdAt | datetime | Creation timestamp (ISO 8601). |
data.items[].updatedAt | datetime | Last update timestamp (ISO 8601). |
data.nextCursor | string | null | Pass 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.
| Input | message |
|---|---|
assetType=bogus | assetType must be one of the following values: image, wysiwyg, resource_file, scorm, xapi, certificateTemplate |
tagIds=not-a-uuid | each value in tagIds must be a UUID |
limit=abc | limit 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"]
}
}| Field | Type | Description |
|---|---|---|
code | string | BAD_REQUEST for query validation. |
message | string | Human-readable reason. Names the field. Multiple constraints are joined with ; . |
category | string | CLIENT_ERROR. |
timestamp | datetime | When the instance built this body (ISO 8601). |
statusCode | integer | HTTP status, 400 here. |
metadata.errors | string[] | 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.