Skip to content

Invite a batch of people

POST
/api/public/v1/invitations/bulk
curl --request POST \
--url https://example.com/api/public/v1/invitations/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "Items": [ { "Email": "example", "LastName": "example", "FirstName": "example", "MiddleName": "example", "Sphere": "SpInternal" } ], "SendInvitations": true }'

Creates a batch of records. Rows are processed in order and independently: the response says, per row, whether it was created or skipped and why. Re-submitting the same batch creates no duplicates. No invitation is emailed unless the batch asks for it with SendInvitations. A batch carries at most 20 rows; a larger one is rejected with 400 before any row is processed, so nothing from it is created — split it into smaller batches.

A batch of invitations. Processed row by row, not atomically: a bad row is reported and skipped, the rest still go out. Re-submitting the same batch creates no duplicates.

object
Items
Array<object>

One person to invite. Creates an invitation, not a person — see the API overview.

object
Email

Corporate email. The matching key across systems; no separate external id exists.

string
LastName
string
FirstName
string
MiddleName
string
nullable
Sphere
string
Allowed values: SpInternal SpExternal
SendInvitations

Whether to email an invitation to every row this call creates. False by default: importing a roster is not the same act as inviting the people on it, and a sync that runs on a schedule should not mail anyone each time it finds someone new. Rows that already existed are never mailed either way — use resend for those.

boolean

OK

Media typeapplication/json

Per-row outcome of a batch, plus the totals.

object
Items
Array<object>

The outcome of one row of a batch, in the order the rows were submitted.

object
Email
string
Result

Whether a batch row produced a new record.

string
Allowed values: Created Skipped
Reason
One of:
string
nullable
Allowed values: AlreadyExists InvalidRow SphereNotPurchased
Id

The employee record this row resolved to — set for created and already-existing rows.

string
nullable
PortalUrl

Where this person’s card lives in the Portal. Opening it needs a signed-in Portal session — the link is an address, not access.

string
nullable
Created
integer format: int32
Skipped
integer format: int32
Example
{
"Items": [
{
"Result": "Created",
"Reason": "AlreadyExists"
}
]
}

Bad Request

Media typeapplication/json

The Integration API’s error shape — RFC 7807 application/problem+json. The Portal API answers in its own { Error, Details } envelope because one client parses one shape; an external integrator expects the standard instead.

object
type
string
nullable
title
required
string
nullable
status
integer format: int32
nullable
detail
string
nullable
instance
string
nullable
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Unauthorized

Media typeapplication/json

The Integration API’s error shape — RFC 7807 application/problem+json. The Portal API answers in its own { Error, Details } envelope because one client parses one shape; an external integrator expects the standard instead.

object
type
string
nullable
title
required
string
nullable
status
integer format: int32
nullable
detail
string
nullable
instance
string
nullable
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}