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.

Get a bulk content job's status and results

Prev
Get
/contents/bulk/{jobId}

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

Returns the status, progress and per-item results of a bulk content job created by any of the /contents/bulk endpoints.

status moves pendingprocessingcompleted, or failed if the job itself could not run. results[] fills in as the job works through the batch, one entry per submitted item, each carrying the index it had in your request.

Per-item failures do not change the HTTP status. A completed job whose items all failed still returns 200 — inspect results[] for the individual outcomes.

Upload URLs in the results are already ageing. For bulk create, each result's presigned URLs are minted as the job processes that item, so their lifetime starts before you read them. Poll and upload promptly, and use GET /contents/{id}/upload-urls to re-issue any that lapse.

Jobs are visible only to the organisation that created them; an unknown id, or the id of a different kind of job, returns 404.

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
Path parameters
jobId
stringRequired

The job id returned by the bulk submit endpoint

Example6863f9a2c1d2e3f4a5b6c7d8
Responses
200

The job's status, progress, and per-item results

completedJob

A finished job with one failure

Two entries succeeded and one failed. Per-entry failures do not change the HTTP status — the job still returns 200.

{
  "jobId": "6863f9a2c1d2e3f4a5b6c7d8",
  "type": "bulk_create_contents",
  "status": "completed",
  "progress": {
    "processed": "3",
    "successful": "2",
    "failed": "1",
    "total": "3"
  },
  "results": [
    {
      "index": "0",
      "status": "SUCCESS",
      "id": "5f9d88d6e1b2a34c56d78902",
      "signedPutUrls": [
        {
          "uploadId": "1a2b3c4d-5e6f-4708-9a0b-1c2d3e4f5a6b",
          "url": "https://s3.example.com/uploads/1a2b3c4d?X-Amz-Signature=..."
        }
      ]
    },
    {
      "index": "1",
      "status": "FAILED",
      "errorCode": "VALIDATION_ERROR",
      "message": "languageCode is not supported"
    },
    {
      "index": "2",
      "status": "SUCCESS",
      "id": "5f9d88d6e1b2a34c56d78903"
    }
  ],
  "startedAt": "2026-07-02T10:15:03.000Z",
  "completedAt": "2026-07-02T10:15:41.000Z",
  "createdAt": "2026-07-02T10:15:02.000Z"
}
Expand All
object

The status, progress and per-entry results of a bulk content job.

jobId
string
Example6863f9a2c1d2e3f4a5b6c7d8
type
string

The type of bulk job

Valid values[ "bulk_create_contents", "bulk_update_contents", "bulk_archive_contents", "bulk_delete_contents" ]
Examplebulk_create_contents
status
string

The processing status of a bulk job

Valid values[ "pending", "processing", "completed", "failed" ]
Exampleprocessing
progress
object (ContentBulkJobProgress)

Progress counters for a bulk content job

processed
number

The number of entries processed so far

Example80.0
successful
number

The number of entries processed successfully

Example78.0
failed
number

The number of entries that failed processing

Example2.0
total
number

The total number of entries in the batch

Example100.0
results
Array of object (ContentBulkJobResult)

Per-entry outcomes, in the order the entries were submitted. Populated as the job works through the batch; empty until processing starts.

object

The outcome of a single entry within a bulk content job

index
number

The entry's position in the array you submitted

Example0.0
status
string

The per-entry outcome

Valid values[ "SUCCESS", "FAILED" ]
ExampleSUCCESS
id
string | null

The content id — newly created for a create job, the targeted record otherwise. Null when the entry failed before a record was reached.

Example5f9d88d6e1b2a34c56d78902
signedPutUrls
Array of object (SignedPutUrl)

Presigned upload URLs for this entry's upload items, on create and update jobs. Minted as the job reaches the entry, so their lifetime is already running when you read them.

object

A presigned URL to PUT one item's file to.

uploadId
string

The uploadId you supplied for the item this URL belongs to

Example4f1c2b7e-9a3d-4c8e-b2f1-6d0a7c5e3b91
url
string

The presigned URL. Time-limited — upload promptly.

Examplehttps://s3.example.com/uploads/4f1c2b7e?X-Amz-Signature=...
errorCode
string | null

A stable code describing the failure.

VALIDATION_ERROR — the entry was rejected while the job was running.

NOT_FOUND — no content with this id exists, or it has already been deleted.

NOT_PUBLISHED — an archive job was asked to archive content that is not published.

MUST_ARCHIVE_FIRST — a delete job was asked to delete published content. Archive it first, then resubmit.

ExampleMUST_ARCHIVE_FIRST
message
string | null

Human-readable detail for the outcome

ExampleContent must be archived before it can be deleted
error
string

A job-level error message, present only when the job itself failed (per-entry failures are reported in results[])

ExampleBulk create job failed
startedAt
string (date-time) | null

When processing started; null while the job is pending

Example2026-07-02T10:15:03Z
completedAt
string (date-time) | null

When processing finished; null until the job completes or fails

Example2026-07-02T10:15:41Z
createdAt
string (date-time) | null

When the job was created

Example2026-07-02T10:15:02Z
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 — no bulk content job with this id exists for the organisation (ids of other job kinds also return 404)

object

The resource cannot be found or does not exist

status
number
Example404.0
error
string
ExampleNot Found
message
string
ExampleCould not find user with ref
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