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

Update Asset Library Item

Update Asset Library item metadata. Providing sourceUrl re-fetches the file for ingestible types.

Updates metadata on an existing Asset Library item. Sending sourceUrl re-fetches the file for ingestible types (image, resource_file, scorm, xapi). Metadata-only requests skip file processing.

PUThttps://example.thoughtindustries.com/v3/assetLibraryItems/:id

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

Example request — metadata only

curl -X PUT "https://{instance}.thoughtindustries.com/v3/assetLibraryItems/7a6b5c4d-3e2f-1a0b-9c8d-7e6f5a4b3c2d" \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "title": "Company logo (updated)",
  "description": "Primary brand mark"
}'

Example request — replace the file

curl -X PUT "https://{instance}.thoughtindustries.com/v3/assetLibraryItems/443d8182-d461-4568-a777-918ca729fd85" \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "sourceUrl": "https://example.com/packages/golf-scorm-2004-rev2.zip",
  "fileName": "golf-scorm-2004-rev2.zip"
}'

Parameters

Requires the centrallibrary.edit permission. A company API key satisfies this.

NameTypeRequiredLocationDescription
iduuidYespathAsset Library item ID.
titlestringNobodyDisplay title. Maximum 500 characters. Empty string is rejected.
sourceUrlurlNobodyHosted HTTP or HTTPS URL. Re-fetches and replaces the stored file.
descriptionstringNobodyMaximum 5000 characters.
fileNamestringNobodyOriginal file name. Maximum 500 characters. When omitted on a sourceUrl replace, the last path segment of the URL is used.
tagIdsuuid[]NobodyReplacement tag ID list.
imageAltTextstringNobodyImage only. Maximum 250 characters.
imageCaptionstringNobodyImage only. Maximum 2000 characters.
imageLinkurlNobodyImage only.
imageNewTabbooleanNobodyImage only.
imageTitlestringNobodyImage only. Maximum 500 characters.

You cannot change assetType. Image-specific fields are rejected unless the existing item is an image.

sourceUrl on a wysiwyg or certificateTemplate item returns 422 — those types cannot be re-ingested. For scorm and xapi, a new sourceUrl sets processingStatus to pending and re-queues extraction. For image and resource_file, the fetch runs in this request.

Example response

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

{
  "data": {
    "id": "7a6b5c4d-3e2f-1a0b-9c8d-7e6f5a4b3c2d",
    "title": "Company logo (updated)",
    "assetType": "image",
    "description": "Primary brand mark",
    "body": "https://ti-course-uploads.s3.amazonaws.com/…/logo.png",
    "contentType": "image/png",
    "fileName": "logo.png",
    "tagIds": [],
    "version": 1,
    "locationIds": [],
    "imageAltText": null,
    "imageCaption": null,
    "imageLink": null,
    "imageNewTab": false,
    "imageTitle": null,
    "isNew": true,
    "processingStatus": "ready",
    "createdAt": "2026-08-26T15:36:24.000Z",
    "updatedAt": "2026-08-26T16:02:11.000Z"
  }
}

After a SCORM or xAPI sourceUrl replace, poll Get Asset Library Item until processingStatus is ready or failed.

Errors

A missing, soft-deleted, revision, or cross-tenant ID returns 404 with code: "RESOURCE_NOT_FOUND" and message: "AssetLibraryItem with identifier \"{id}\" was not found".

Image fields on a non-image item return 422:

{
  "code": "IMAGE_FIELDS_NOT_ALLOWED",
  "message": "Image-specific fields can only be set on assets with type \"image\".",
  "category": "BUSINESS_LOGIC",
  "timestamp": "2026-08-26T16:02:11.000Z",
  "statusCode": 422
}

sourceUrl on a non-ingestible type returns 422 with code: "SOURCE_URL_NOT_SUPPORTED" and message: "Re-ingestion is not supported for asset type \"wysiwyg\"." (the type in the message is the stored type).

When an image or resource_file replace fails to fetch, metadata that was also in the body is still saved, then the request returns 422 with code: "ASSET_UPLOAD_FAILED" and message: "Failed to process the asset file. The metadata changes were saved but the file was not updated. Please verify the source URL and try again."

A path id that is not a UUID, a malformed URL, or an unrecognized property 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.

A missing or invalid API key returns 401 with code: "UNAUTHENTICATED". A manager session without centrallibrary.edit returns 403 with code: "FORBIDDEN" and message: "Insufficient permissions: centrallibrary.edit required".

Rate limit

60 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.