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 job's status and results

Prev Next
Get
/users/bulk/{jobId}

Returns the status, progress, and per-item results of a bulk user lifecycle job created by POST /users/bulk/create, POST /users/bulk/suspend or POST /users/bulk/delete.

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

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

Expand All
object

The status, progress, and per-item results of a bulk user lifecycle job.

jobId
string
Example6863f9a2c1d2e3f4a5b6c7d8
type
string

The type of bulk job

Valid values[ "bulk_create_users_by_ref", "bulk_suspend_users_by_ref", "bulk_delete_users_by_ref" ]
Examplebulk_suspend_users_by_ref
status
string

The processing status of a bulk job

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

Progress counters for a bulk job

processed
number

The number of refs processed so far

Example150.0
successful
number

The number of refs processed successfully

Example148.0
failed
number

The number of refs that failed processing

Example2.0
total
number

The total number of distinct refs in the batch (duplicate refs in a submission are collapsed and processed once)

Example300.0
results
Array of object (BulkJobResult)

Per-item outcomes, one per distinct ref, in the order the refs were submitted (duplicate refs are collapsed and reported once). Populated as batches complete; empty until processing starts.

object

The outcome of a single item within a bulk job

ref
string

The user ref this result corresponds to

ExampleUID30084022
id
string | null

The resolved user id — the user that was found for a suspend or delete item, or the user that a create item created

Example6143eedfd39243e830bdbb8c
status
string

The per-item outcome

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

A stable code describing the outcome.

Suspend jobs: USER_NOT_FOUND, CANNOT_SUSPEND_SELF, USER_NOT_ELIGIBLE (the user is in a state, such as expired, that cannot be suspended), and SUSPEND_FAILED accompany a FAILED status; ALREADY_SUSPENDED accompanies a SUCCESS status (the user was already suspended, so no changes were made).

Delete jobs: USER_NOT_FOUND (also reported for a ref that was already deleted — deletion anonymises the user record, so the ref no longer resolves), DELETE_RETRYABLE (a transient failure, such as a rate limit or a network fault; the user is untouched and the ref can be retried by resubmitting it), and DELETE_FAILED accompany a FAILED status; DELETED_CLEANUP_INCOMPLETE accompanies a SUCCESS status (the user was deleted, but some post-delete cleanup did not fully complete).

Create jobs: USER_ALREADY_EXISTS (another active user already holds this ref or email address; no user was modified), VALIDATION_FAILED (the item was rejected by the create rules — message holds the field-level detail), INVALID_INPUT (the item carried no usable ref, so no ref is reported on the result), and CREATE_FAILED accompany a FAILED status.

ExampleUSER_NOT_FOUND
message
string | null

Human-readable detail for the outcome

ExampleNo user with this ref exists
error
string

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

ExampleBulk suspend 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 user lifecycle job with this id exists for the organisation (ids of other job kinds also return 404)

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 (NotFoundError)

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