Documentation Index

Fetch the complete documentation index at: https://docs.thrivelearning.com/llms.txt

Use this file to discover all available pages before exploring further.

Archive a content record

Prev Next
Post
/contents/{id}/archive

Coming soon. This endpoint is not available yet, and the details below may change before release.

Archives a content record, removing it from the published catalogue. This is the reversible take-down — the everyday "unpublish" — and it can be undone with POST /contents/{id}/restore.

Only published content can be archived; anything else returns 409.

Archiving is also the first half of permanently removing published content, since DELETE /contents/{id} refuses to delete a published record.

Security
HTTP
Type basic

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

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
  • 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

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.

FlowClient Credentials
Token URLhttps://public.api.learn.link/oauth2/token/:tenantId
Scopes:
api/writeWrite access to the API.
Path parameters
id
stringRequired

Unique identifier of the content item

Pattern^[0-9a-fA-F]{24}$
Example5f9d88d6e1b2a34c56d78902
Body parameters
actor

Identify the acting user

Every write must say who is performing it. Supply authorRef, collaborationId, or both.

{
  "authorRef": "UID30084022"
}
Expand All
object

Identifies who is performing the write. At least one of authorRef or collaborationId is required on every write, so that the change is attributed to a real person or collaboration rather than to the system.

Both are validated before anything is written — an unknown reference, or one belonging to another organisation, is rejected.

This is provisional. How the acting user is supplied may change before release — most likely moving from the request body to a request header, so that operations such as DELETE do not require a body. The identifiers themselves are not expected to change.

authorRef
string

The ref of the user performing the write. This user becomes the acting user for the operation and, on create, the content's author.

ExampleUID30084022
collaborationId
string

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.

Pattern^[0-9a-fA-F]{24}$
Example5c8936159ec2d00010cdd334
AnyOf
object
object
authorRef
string Required

The ref of the user performing the write. This user becomes the acting user for the operation and, on create, the content's author.

ExampleUID30084022
collaborationId
string

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.

Pattern^[0-9a-fA-F]{24}$
Example5c8936159ec2d00010cdd334
title
string

Title of the content

Min length3
Max length150
ExampleOnboarding pack (2026)
completionType
string

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.

Valid values[ "auto", "confirm", "external", "on_passing_quizzes", "on_passing_observer_completed_quizzes", "on_passing_assessments", "on_elearning_completion" ]
Exampleconfirm
cpdCategoryId
string

The CPD category to record this content against

Pattern^[0-9a-fA-F]{24}$
Example507f1f77bcf86cd799439012
attributes
object

Behavioural settings for the content

canComment
boolean

Whether learners may comment on this content

Exampletrue
incrementVersion
boolean

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.

Defaultfalse
Examplefalse
thumbnailUrl
string (uri)

A publicly reachable image to fetch and use as the content thumbnail, replacing any existing one. Processed asynchronously.

Examplehttps://example.com/thumb.png
addItems
Array of object (ContentItemInput)

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 itemselearning, 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 itemsrich_text is ready immediately; url is scraped asynchronously for its title, description and image.

OneOf
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "elearning" ]
Exampleelearning
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
format
string

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.

Valid values[ "scorm12", "scorm2004", "cmi5", "tincan", "web" ]
Examplescorm2004
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "document" ]
Exampledocument
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
pages
integer Required

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.

Minimum1
Example12
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "video" ]
Examplevideo
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
primaryLanguage
string

The spoken language of the video

Exampleen-gb
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "audio" ]
Exampleaudio
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
durationMs
integer Required

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.

Minimum0
Example185000
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "image" ]
Exampleimage
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
altText
string

Alternative text, used by screen readers

ExampleA diagram of the onboarding journey
caption
string

A caption shown beneath the image

Max length1000
ExampleThe onboarding journey at a glance
ctaUrl
string (uri)

A link to open when the image is selected

Examplehttps://example.com/onboarding
openInNewTab
boolean

Whether ctaUrl opens in a new tab

Exampletrue
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "rich_text" ]
Examplerich_text
meta
object
body
string

The rich text body as HTML

Max length100000
Example<p>Welcome to the team.</p>
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "url" ]
Exampleurl
meta
object Required
url
string Required

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.

Examplehttps://example.com/handbook
updateItems
Array of object (ContentItemUpdateInput)

Existing items to change, identified by their item id

object

A change to one existing item, identified by its id.

id
string Required

The id of the item to change

Pattern^[0-9a-fA-F]{24}$
Example5c8936159ec2d00010cdd334
rank
integer

The item's position within the content, lowest first

Minimum0
Example1
summary
string

A short label for the item, shown to learners

Max length255
ExampleWelcome
meta
object

The type-specific fields to change. The shape must match the item's existing type — see ContentItemInput for what each type accepts.

removeItems
Array of string

The ids of items to delete. Removing an upload item deletes its stored file permanently.

string
Pattern^[0-9a-fA-F]{24}$
Example5c8936159ec2d00010cdd334
object
object
authorRef
string

The ref of the user performing the write. This user becomes the acting user for the operation and, on create, the content's author.

ExampleUID30084022
collaborationId
string Required

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.

Pattern^[0-9a-fA-F]{24}$
Example5c8936159ec2d00010cdd334
title
string

Title of the content

Min length3
Max length150
ExampleOnboarding pack (2026)
completionType
string

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.

Valid values[ "auto", "confirm", "external", "on_passing_quizzes", "on_passing_observer_completed_quizzes", "on_passing_assessments", "on_elearning_completion" ]
Exampleconfirm
cpdCategoryId
string

The CPD category to record this content against

Pattern^[0-9a-fA-F]{24}$
Example507f1f77bcf86cd799439012
attributes
object

Behavioural settings for the content

canComment
boolean

Whether learners may comment on this content

Exampletrue
incrementVersion
boolean

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.

Defaultfalse
Examplefalse
thumbnailUrl
string (uri)

A publicly reachable image to fetch and use as the content thumbnail, replacing any existing one. Processed asynchronously.

Examplehttps://example.com/thumb.png
addItems
Array of object (ContentItemInput)

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 itemselearning, 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 itemsrich_text is ready immediately; url is scraped asynchronously for its title, description and image.

OneOf
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "elearning" ]
Exampleelearning
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
format
string

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.

Valid values[ "scorm12", "scorm2004", "cmi5", "tincan", "web" ]
Examplescorm2004
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "document" ]
Exampledocument
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
pages
integer Required

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.

Minimum1
Example12
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "video" ]
Examplevideo
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
primaryLanguage
string

The spoken language of the video

Exampleen-gb
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "audio" ]
Exampleaudio
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
durationMs
integer Required

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.

Minimum0
Example185000
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "image" ]
Exampleimage
meta
object Required
name
string Required

The file name, including its extension. The extension must match the item type you declared — a .pdf sent as a video is rejected.

Examplecourse.zip
uploadId
string (uuid) Required

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.

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
canDownload
boolean

Whether learners may download the original file

Defaulttrue
Exampletrue
altText
string

Alternative text, used by screen readers

ExampleA diagram of the onboarding journey
caption
string

A caption shown beneath the image

Max length1000
ExampleThe onboarding journey at a glance
ctaUrl
string (uri)

A link to open when the image is selected

Examplehttps://example.com/onboarding
openInNewTab
boolean

Whether ctaUrl opens in a new tab

Exampletrue
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "rich_text" ]
Examplerich_text
meta
object
body
string

The rich text body as HTML

Max length100000
Example<p>Welcome to the team.</p>
object
object
rank
integer Required

The item's position within the content, lowest first. Required, and every item in a content record must have a different rank.

Minimum0
Example0
summary
string

A short label for the item, shown to learners. Optional on upload items; required on rich text and link items.

ExampleWelcome
type
string Required
Valid values[ "url" ]
Exampleurl
meta
object Required
url
string Required

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.

Examplehttps://example.com/handbook
updateItems
Array of object (ContentItemUpdateInput)

Existing items to change, identified by their item id

object

A change to one existing item, identified by its id.

id
string Required

The id of the item to change

Pattern^[0-9a-fA-F]{24}$
Example5c8936159ec2d00010cdd334
rank
integer

The item's position within the content, lowest first

Minimum0
Example1
summary
string

A short label for the item, shown to learners

Max length255
ExampleWelcome
meta
object

The type-specific fields to change. The shape must match the item's existing type — see ContentItemInput for what each type accepts.

removeItems
Array of string

The ids of items to delete. Removing an upload item deletes its stored file permanently.

string
Pattern^[0-9a-fA-F]{24}$
Example5c8936159ec2d00010cdd334
Responses
200

The archived content

archived

Archived

The content has left the published catalogue and can be restored.

{
  "id": "5f9d88d6e1b2a34c56d78902",
  "status": "archived",
  "items": [
    {
      "id": "5c8936159ec2d00010cdd334",
      "type": "elearning",
      "rank": "0",
      "summary": "Onboarding course",
      "status": "ok"
    }
  ]
}
Expand All
object

What the publish, archive and restore endpoints return: the record's identifier, its lifecycle status, and the state of its items. This is not the same shape as the GET /contents/{id} read, which returns the catalogue view of a record.

id
string

Unique identifier for the content

Pattern^[0-9a-fA-F]{24}$
Example5f9d88d6e1b2a34c56d78902
status
string

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.

Valid values[ "draft", "ready", "published", "archived" ]
Exampledraft
items
Array of object (ContentItemState)

The items that make up the content, with per-item processing state

object

One item within a content record, with its processing state.

id
string

Unique identifier for the item

Example5c8936159ec2d00010cdd334
type
string

The item type

Exampleelearning
rank
integer

The item's position within the content, lowest first

Example0
summary
string

A short label for the item, shown to learners

ExampleWelcome
status
string

The item's processing state. An item must reach ok before the content can become ready.

Valid values[ "processing", "ok", "error" ]
Exampleprocessing
error
string | null

Why processing failed, when status is error

Example
401

Unauthorized

object

Unauthorized

status
number
Example401.0
error
string
ExampleUnauthorized
message
string
403

Forbidden

object

Forbidden

status
number
Example403.0
error
string
ExampleForbidden
message
string #deprecatedtemplate# #additional-property-template#
OneOf
string
string
object
object
404

Not Found

object

Not found

status
number
Example404.0
error
string
ExampleNot Found
message
string #deprecatedtemplate# #additional-property-template#
OneOf
string
string
object
object
409

Conflict — the content is not published, so it cannot be archived.

object

There was a conflict with the request and the resource

status
number
Example409.0
error
string
ExampleConflict
message
string
ExampleThe resource already exists
415

Unsupported Media Type — Content-Type must be application/json

Expand All
object
id
string
ExampleUNIQUEREFERENCE111000
timestamp
string
Example2020-03-09T22:18:26.625Z
eventType
string
Valid values[ "user_joined", "user_updated", "user_suspended" ]
message
object (UnprocessableEntityError)

The request could not be processed due to a validation error

status
number
Example422.0
error
string
ExampleUnprocessable Entity
message
string
ExampleThe startDate must be in a valid ISO 8601 format
422

Unprocessable Content

object

Unprocessable Content

status
number
Example422.0
error
string
ExampleUnprocessable Content
message
string #deprecatedtemplate# #additional-property-template#
OneOf
string
string
object
object
502

Bad Gateway

object

The request could not be completed because a service it depends on failed. For write operations the content was not modified.

status
number
Example502.0
error
string
ExampleBad Gateway
message
string
ExampleThe request could not be completed because a service it depends on is unavailable. Please retry shortly.
default

An unexpected error has occurred

When any default error occurs it may be a system failure and persistent errors may require support.

Expand All
object
id
string
ExampleUNIQUEREFERENCE111000
timestamp
string
Example2020-03-09T22:18:26.625Z
eventType
string
Valid values[ "user_joined", "user_updated", "user_suspended" ]
message
object (InternalServerError)

The server is unable to process the request

status
number
Example500.0
error
string
ExampleInternal Server Error