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 pending → processing → completed, 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.
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.
The job id returned by the bulk submit endpoint
The job's status, progress, and per-item results
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"
}The status, progress and per-entry results of a bulk content job.
The type of bulk job
The processing status of a bulk job
Progress counters for a bulk content job
The number of entries processed so far
The number of entries processed successfully
The number of entries that failed processing
The total number of entries in the batch
Per-entry outcomes, in the order the entries were submitted. Populated as the job works through the batch; empty until processing starts.
The outcome of a single entry within a bulk content job
The entry's position in the array you submitted
The per-entry outcome
The content id — newly created for a create job, the targeted record otherwise. Null when the entry failed before a record was reached.
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.
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 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.
Human-readable detail for the outcome
A job-level error message, present only when the job itself failed (per-entry failures are reported in results[])
When processing started; null while the job is pending
When processing finished; null until the job completes or fails
When the job was created
Unauthorized
Unauthorized
Forbidden
Forbidden
Not Found — no bulk content job with this id exists for the organisation (ids of other job kinds also return 404)
The resource cannot be found or does not exist
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