Coming soon. This endpoint is not available yet, and the details below may change before release.
Updates a content record — its title, completion behaviour, CPD category, comment controls, and its set of items.
This is a true partial update: send only the fields you want to change. Items are edited through three arrays — addItems appends new items, updateItems edits existing ones by their item id, and removeItems deletes them by id. Adding an upload item returns a fresh presigned PUT URL for it in signedPutUrls.
Updates are last-write-wins. There is no version or If-Match precondition, so an update through this API and a simultaneous edit in the authoring UI can silently overwrite one another.
incrementVersion is destructive. It bumps the content version and is valid only on published content (409 otherwise). Content keeps no version history, so replacing an item deletes the previous asset outright. Treat it as replace-and-delete, not as a snapshot you can roll back to.
Skills, topics and audiences cannot be set here. Skills and topics are set when the content is published — see POST /contents/{id}/publish. Sharing content with an audience has its own endpoints.
The per-request item cap applies to the items being added, not to the resulting document: at most one upload item plus one non-upload item per call. Content authored in the UI is never rejected for already holding more than that.
HTTP Basic authentication using your Tenant ID and API secret.
- Username is the Tenant ID (i.e.
eu-west-2_AbcdEfghI) - Password is the API secret you would have received.
You can also authenticate using OAuth 2.0 client credentials (oauth2 security scheme) instead of Basic auth.
OAuth 2.0 client credentials authentication.
Use the following token endpoints (replace :tenantId with your Tenant ID):
Public API access tokens
- Staging:
https://public.api.learnstaging.link/oauth2/token/:tenantId - Production:
https://public.api.learn.link/oauth2/token/:tenantId - Staging MEA:
https://public.api.meastaging.learn.tech/oauth2/token/:tenantId - Production MEA:
https://public.api.mea.learn.tech/oauth2/token/:tenantId
- Staging:
Webhooks access tokens
- Staging:
https://user.api.learnstaging.link/oauth2/token/:tenantId - Production:
https://user.api.learn.link/oauth2/token/:tenantId - Staging MEA:
https://user.api.meastaging.learn.tech/oauth2/token/:tenantId - Production MEA:
https://user.api.mea.learn.tech/oauth2/token/:tenantId
- Staging:
All access tokens must be sent using the Authorization: Bearer <access_token> header.
Scopes
For API access (non-webhooks), the following scopes are available:
api/all– Full read and write access to the API.api/read– Read-only access to the API.api/write– Write access to the API.
For webhooks, the following scopes are available:
api/webhooks– Access to webhook functionality.api/all– Full read and write access to the API, including webhooks.
Tokens must include appropriate scopes for the endpoints you wish to call.
Unique identifier of the content item
Retitle, add an item and remove another
Sends only what is changing. The new video item gets a presigned upload URL back in signedPutUrls; the removed item's file is deleted permanently.
{
"authorRef": "UID30084022",
"title": "Onboarding pack (2026)",
"addItems": [
{
"type": "video",
"rank": "2",
"summary": "A word from the CEO",
"meta": {
"name": "welcome.mp4",
"uploadId": "8c2d5a1f-3e7b-42a9-9d16-0b4f8e6c2a37"
}
}
],
"removeItems": [
"5c8936159ec2d00010cdd334"
]
}The changes to apply. Every field is optional — send only what you want to change.
Title of the content
How a learner completes this content. auto, confirm and external apply to any content; on_elearning_completion requires an e-learning item; on_passing_quizzes, on_passing_observer_completed_quizzes and on_passing_assessments apply to quiz and assessment items, which are not yet supported by this API.
Note that on_elearning_completion combined with a web-format e-learning package can never reach ready.
The CPD category to record this content against
Behavioural settings for the content
Whether learners may comment on this content
Bump the content's version number. Valid only on published content (409 otherwise). This is not a snapshot — content keeps no version history, so any item replaced in this request has its previous asset deleted permanently.
A publicly reachable image to fetch and use as the content thumbnail, replacing any existing one. Processed asynchronously.
Items to append. The per-request cap applies to this array only, not to the resulting document: at most one upload item plus one non-upload item.
One item within a content record. The type decides which meta fields apply.
Upload items — elearning, file, video, audio and image — are two-phase: you declare the item here with an uploadId you generate, then PUT the file to the matching URL returned in signedPutUrls. The item stays at processing until the platform has handled the file.
Non-upload items — rich_text is ready immediately; url is scraped asynchronously for its title, description and image.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The package format. Normally detected while the package is unpacked, so you rarely need to send it. A web package cannot be used with a completionType of on_elearning_completion.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The document's page count, used to estimate its duration.
This field is under review. It is currently required, but the page count cannot be known until after the file has been uploaded. Document items are therefore not yet usable end to end, and this requirement is expected to be relaxed before release.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The spoken language of the video
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The audio duration in milliseconds.
This field is under review. It is currently required, but the duration cannot be known until after the file has been uploaded. Audio items are therefore not yet usable end to end, and this requirement is expected to be relaxed before release.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
Alternative text, used by screen readers
A caption shown beneath the image
A link to open when the image is selected
Whether ctaUrl opens in a new tab
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The rich text body as HTML
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
Either an external link or a reference to other content on the platform. External links must be publicly reachable — those resolving to internal or private addresses are rejected.
Existing items to change, identified by their item id
A change to one existing item, identified by its id.
The id of the item to change
The item's position within the content, lowest first
A short label for the item, shown to learners
The type-specific fields to change. The shape must match the item's existing type — see ContentItemInput for what each type accepts.
The ids of items to delete. Removing an upload item deletes its stored file permanently.
The ref of the user performing the write. This user becomes the acting user for the operation and, on create, the content's author.
The id of the collaboration that owns the content. When supplied alongside authorRef, the collaboration owns the content and the author is the acting user. When supplied on its own there is no acting user, and the platform records the change against a generic system account.
Title of the content
How a learner completes this content. auto, confirm and external apply to any content; on_elearning_completion requires an e-learning item; on_passing_quizzes, on_passing_observer_completed_quizzes and on_passing_assessments apply to quiz and assessment items, which are not yet supported by this API.
Note that on_elearning_completion combined with a web-format e-learning package can never reach ready.
The CPD category to record this content against
Behavioural settings for the content
Whether learners may comment on this content
Bump the content's version number. Valid only on published content (409 otherwise). This is not a snapshot — content keeps no version history, so any item replaced in this request has its previous asset deleted permanently.
A publicly reachable image to fetch and use as the content thumbnail, replacing any existing one. Processed asynchronously.
Items to append. The per-request cap applies to this array only, not to the resulting document: at most one upload item plus one non-upload item.
One item within a content record. The type decides which meta fields apply.
Upload items — elearning, file, video, audio and image — are two-phase: you declare the item here with an uploadId you generate, then PUT the file to the matching URL returned in signedPutUrls. The item stays at processing until the platform has handled the file.
Non-upload items — rich_text is ready immediately; url is scraped asynchronously for its title, description and image.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The package format. Normally detected while the package is unpacked, so you rarely need to send it. A web package cannot be used with a completionType of on_elearning_completion.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The document's page count, used to estimate its duration.
This field is under review. It is currently required, but the page count cannot be known until after the file has been uploaded. Document items are therefore not yet usable end to end, and this requirement is expected to be relaxed before release.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The spoken language of the video
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The audio duration in milliseconds.
This field is under review. It is currently required, but the duration cannot be known until after the file has been uploaded. Audio items are therefore not yet usable end to end, and this requirement is expected to be relaxed before release.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
Alternative text, used by screen readers
A caption shown beneath the image
A link to open when the image is selected
Whether ctaUrl opens in a new tab
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The rich text body as HTML
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
Either an external link or a reference to other content on the platform. External links must be publicly reachable — those resolving to internal or private addresses are rejected.
Existing items to change, identified by their item id
A change to one existing item, identified by its id.
The id of the item to change
The item's position within the content, lowest first
A short label for the item, shown to learners
The type-specific fields to change. The shape must match the item's existing type — see ContentItemInput for what each type accepts.
The ids of items to delete. Removing an upload item deletes its stored file permanently.
The ref of the user performing the write. This user becomes the acting user for the operation and, on create, the content's author.
The id of the collaboration that owns the content. When supplied alongside authorRef, the collaboration owns the content and the author is the acting user. When supplied on its own there is no acting user, and the platform records the change against a generic system account.
Title of the content
How a learner completes this content. auto, confirm and external apply to any content; on_elearning_completion requires an e-learning item; on_passing_quizzes, on_passing_observer_completed_quizzes and on_passing_assessments apply to quiz and assessment items, which are not yet supported by this API.
Note that on_elearning_completion combined with a web-format e-learning package can never reach ready.
The CPD category to record this content against
Behavioural settings for the content
Whether learners may comment on this content
Bump the content's version number. Valid only on published content (409 otherwise). This is not a snapshot — content keeps no version history, so any item replaced in this request has its previous asset deleted permanently.
A publicly reachable image to fetch and use as the content thumbnail, replacing any existing one. Processed asynchronously.
Items to append. The per-request cap applies to this array only, not to the resulting document: at most one upload item plus one non-upload item.
One item within a content record. The type decides which meta fields apply.
Upload items — elearning, file, video, audio and image — are two-phase: you declare the item here with an uploadId you generate, then PUT the file to the matching URL returned in signedPutUrls. The item stays at processing until the platform has handled the file.
Non-upload items — rich_text is ready immediately; url is scraped asynchronously for its title, description and image.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The package format. Normally detected while the package is unpacked, so you rarely need to send it. A web package cannot be used with a completionType of on_elearning_completion.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The document's page count, used to estimate its duration.
This field is under review. It is currently required, but the page count cannot be known until after the file has been uploaded. Document items are therefore not yet usable end to end, and this requirement is expected to be relaxed before release.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The spoken language of the video
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
The audio duration in milliseconds.
This field is under review. It is currently required, but the duration cannot be known until after the file has been uploaded. Audio items are therefore not yet usable end to end, and this requirement is expected to be relaxed before release.
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.
A UUID you generate for this upload. It is echoed back in signedPutUrls so you can tell which URL belongs to which item, and must be unique within the content.
Whether learners may download the original file
Alternative text, used by screen readers
A caption shown beneath the image
A link to open when the image is selected
Whether ctaUrl opens in a new tab
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
The rich text body as HTML
The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.
A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.
Either an external link or a reference to other content on the platform. External links must be publicly reachable — those resolving to internal or private addresses are rejected.
Existing items to change, identified by their item id
A change to one existing item, identified by its id.
The id of the item to change
The item's position within the content, lowest first
A short label for the item, shown to learners
The type-specific fields to change. The shape must match the item's existing type — see ContentItemInput for what each type accepts.
The ids of items to delete. Removing an upload item deletes its stored file permanently.
The updated content, with fresh upload URLs for any added items
Updated, with an upload URL for the added item
The new video item is processing and has its own presigned URL. The thumbnail was already set, so thumbnailUploadUrl is null.
{
"id": "5f9d88d6e1b2a34c56d78902",
"status": "published",
"items": [
{
"id": "5c8936159ec2d00010cdd335",
"type": "rich_text",
"rank": "1",
"summary": "Welcome",
"status": "ok"
},
{
"id": "5c8936159ec2d00010cdd336",
"type": "video",
"rank": "2",
"summary": "A word from the CEO",
"status": "processing"
}
],
"signedPutUrls": [
{
"uploadId": "8c2d5a1f-3e7b-42a9-9d16-0b4f8e6c2a37",
"url": "https://s3.example.com/uploads/8c2d5a1f?X-Amz-Signature=..."
}
],
"thumbnailUploadUrl": "null"
}What the create and update endpoints return: the content record, plus everything you need to finish setting it up — presigned URLs for any items awaiting a file, and one for the content thumbnail.
Unique identifier for the content
Lifecycle status of a content record. Note this is a different vocabulary from the statuses filter on GET /contents, which uses the legacy values created, published, archived and deleted.
The items that make up the content, with per-item processing state
One item within a content record, with its processing state.
Unique identifier for the item
The item type
The item's position within the content, lowest first
A short label for the item, shown to learners
The item's processing state. An item must reach ok before the content can become ready.
Why processing failed, when status is error
Presigned URLs for the upload items in this request, one per item. Empty when the request added no upload items. Use GET /contents/{id}/upload-urls if one expires before you upload.
A presigned URL to PUT one item's file to.
The uploadId you supplied for the item this URL belongs to
The presigned URL. Time-limited — upload promptly.
A presigned URL to PUT the content thumbnail to. Null when you supplied a thumbnailUrl for us to fetch instead. The content cannot reach ready until a thumbnail has been processed by one route or the other.
Unauthorized
Unauthorized
Forbidden
Forbidden
Not Found
Not found
Conflict — incrementVersion was sent for content that is not published.
There was a conflict with the request and the resource
Unsupported Media Type — Content-Type must be application/json
The request could not be processed due to a validation error
Unprocessable Content
Unprocessable Content
Bad Gateway
The request could not be completed because a service it depends on failed. For write operations the content was not modified.
An unexpected error has occurred
When any default error occurs it may be a system failure and persistent errors may require support.
The server is unable to process the request