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.

Create users in bulk

Prev Next
Post
/users/bulk/create

Submits an asynchronous job that creates the given users. Each item takes the same fields as POST /users.

The endpoint responds immediately with 202 Accepted and a jobId; the users are created in the background. Poll GET /users/bulk/{jobId} for progress and per-item results.

Submissions are idempotent: replaying a request with the same Idempotency-Key header returns the existing job instead of creating a duplicate.

A ref that already belongs to a user is reported as a USER_ALREADY_EXISTS per-item failure; no existing user is modified. A ref that belongs to a suspended user reactivates that user, reported as a per-item success with the message User reactivated.

Every item is validated before the job is created, so a batch that holds an invalid item returns 207 and creates no job.

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
Header parameters
Idempotency-Key
stringRequired

Caller-generated idempotency key for the submission. Generate it once per logical submission and reuse it on retries — replaying the same key returns the existing job instead of creating a duplicate. Requests without the header are rejected with 422.

Body parameters
bulkCreateUsers

Create a batch of users

Creates up to 1000 users, each item taking the same fields as POST /users. The required Idempotency-Key header guards against duplicate jobs when the request is retried.

"{\n  \"users\": [\n    {\n      \"ref\": \"UID30084022\",\n      \"firstName\": \"Thomas\",\n      \"lastName\": \"Jefferson\",\n      \"email\": \"thomas.jefferson@thrivelearning.com\",\n      \"role\": \"learner\",\n      \"jobTitle\": \"Director\",\n      \"additionalFields\": {\n        \"department\": \"Engineering\"\n      }\n    },\n    {\n      \"ref\": \"UID30084023\",\n      \"firstName\": \"Abigail\",\n      \"lastName\": \"Adams\",\n      \"email\": \"abigail.adams@thrivelearning.com\",\n      \"loginMethod\": \"email\"\n    }\n  ]\n}\n"
Expand All
object

The input to create users in bulk.

users
Array of object (UserLifecycleCreateBody) Required

The users to create, each taking the same fields as POST /users. Up to 1000 per request. Duplicate refs are collapsed and processed once, the first occurrence winning.

Min items1
Max items1000
object

The input to create a new user account.

The email field is required unless loginMethod is set to ref.

ref
string Required

Your organisation's unique identifier for this individual

Max length500
ExampleUID30084022
firstName
string Required

The given name of the individual

Max length255
ExampleThomas
lastName
string Required

The family name of the individual

Max length255
ExampleJefferson
email
string (email)

The email address for the user. Required unless loginMethod is 'ref'.

Max length320
Exampleuser@thrivelearning.com
loginMethod
string

How the user logs in. Defaults to 'email'.

Valid values[ "email", "ref" ]
Default"email"
Exampleemail
role
string

The role assigned to this individual. Defaults to 'learner' if omitted.

Valid values[ "administrator", "learneradmin", "learner" ]
Examplelearner
jobTitle
string

The name of this individual's role in your organisation

Max length500
ExampleDirector
managerRef
string

Your organisation's unique identifier for this individual's line manager

Max length500
ExampleUID0034234555
startDate
string (date-time)

The date this individual started working with your organisation

Example2021-08-19T18:00:00Z
endDate
string (date-time) | null

The date this individual left your organisation

timeZone
string

The user's preferred timezone. If not provided the tenant default is used.

ExampleEurope/London
languageCode
string

The user’s preferred language. If not provided the tenant default is used.

One caveat is that the tenant may only use the languages they have requested.

Valid values[ "cs", "de", "en-gb", "en-us", "es", "es-mx", "fi", "fr", "hu", "id", "it", "ja", "ja-jp", "kn-in", "ms-my", "nl", "pl", "pt", "sk", "sv", "th", "tr", "zh-cn" ]
Defaultnull
Exampleen-gb
sso
boolean

Whether this account is managed by an Authentication provider or not.

Exampletrue
domain
string

The domain this individual is associated with

Max length255
Exampletenant.learn.link
additionalFields
object

Custom field key-value pairs matching your configured custom fields.

Responses
202

Accepted — a bulk create job was created (or an existing job was matched by idempotency key). Poll pollUrl for progress and per-item results.

object

Returned when a bulk job has been accepted for processing.

jobId
string

The id of the job processing the batch

Example6863f9a2c1d2e3f4a5b6c7d8
status
string

The processing status of a bulk job

Valid values[ "pending", "processing", "completed", "failed" ]
Exampleprocessing
pollUrl
string

The path to poll for progress and per-item results

Example/rest/v2/users/bulk/6863f9a2c1d2e3f4a5b6c7d8
207

Multi-Status — some users failed validation, so no job was created. The envelope lists the users that passed validation and the ones that were rejected, so the batch can be corrected and resubmitted.

Expand All
object

A multi-status envelope returned when some items in the batch failed validation. No job is created; correct the failed items and resubmit.

success
object

The items that passed validation

count
number

The number of items that passed validation

Example2.0
entities
Array of object
object
reference
string

The ref of the item, as submitted

ExampleUID30084022
failure
object

The items that failed validation

count
number

The number of items that failed validation

Example1.0
entities
Array of object
object
reference
string

The position of the invalid item in the submitted array (refs[2] for suspend and delete, users[2] for create)

Examplerefs[2]
message
string

The reason the item was rejected. Create items report every rejected field, as field: reason pairs joined with ; .

Examplecannot be empty
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
413

Content Too Large — the request body is above 2 MB. Split the batch and resubmit the parts.

object

An envelope containing information about the event errors

id
string
ExampleUNIQUEREFERENCE111000
timestamp
string
Example2020-03-09T22:18:26.625Z
eventType
string
Valid values[ "user_joined", "user_updated", "user_suspended" ]
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 — validation failed (missing or empty users, more than 1000 users, a missing or invalid Idempotency-Key header, or no user in the batch passed validation)

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