Invite a batch of people
const url = 'https://example.com/api/public/v1/invitations/bulk';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"Items":[{"Email":"example","LastName":"example","FirstName":"example","MiddleName":"example","Sphere":"SpInternal"}],"SendInvitations":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”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
One person to invite. Creates an invitation, not a person — see the API overview.
object
Corporate email. The matching key across systems; no separate external id exists.
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.
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
One person to invite. Creates an invitation, not a person — see the API overview.
object
Corporate email. The matching key across systems; no separate external id exists.
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.
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
One person to invite. Creates an invitation, not a person — see the API overview.
object
Corporate email. The matching key across systems; no separate external id exists.
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.
Responses
Section titled “Responses”OK
Per-row outcome of a batch, plus the totals.
object
The outcome of one row of a batch, in the order the rows were submitted.
object
Whether a batch row produced a new record.
The employee record this row resolved to — set for created and already-existing rows.
Where this person’s card lives in the Portal. Opening it needs a signed-in Portal session — the link is an address, not access.
Example
{ "Items": [ { "Result": "Created", "Reason": "AlreadyExists" } ]}Bad Request
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
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}Unauthorized
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
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}