Skip to main content
Six endpoints under /v1/workspace mirror what the dashboard does with members and seats.

Which credential works where

This is the part to read before anything else.
Writes require OAuth on purpose. An x-api-key request has no user behind it — the key belongs to the workspace, not to a person. If inviting were allowed with a tenant-scoped key, then whoever holds any key of the workspace could invite themselves an Admin, and the key would become a path to taking over the account.
Transferring ownership and archiving a workspace have no API at all. They are the only actions that change who pays the bill, and no machine credential reaches them.

Read the workspace

seatsUsed counts active members and pending invitations that have not expired. An expired invitation stops counting on its own.

List members

Returns active members and pending invitations in one list, distinguished by status.
The list never contains an invitation link or token, and it never will: only a hash of the token is stored, so the link is not derivable after the fact. If you need a link for a pending invitation, call resend.

Invite

sendEmail: false is the hatch for delivering the invitation your own way. The response is the only place the link appears — if you lose it, call resend, which issues a new one and kills the old. Inviting an address that already has a pending invitation is not an error: it rotates the token in place and returns 200 instead of 201.

Errors worth handling

Removing a member who created API keys

DELETE refuses with 409 MEMBER_HAS_API_KEYS and lists the keys:
Repeat the call with an explicit decision:
  • revoke — the keys stop authenticating. Integrations through them break immediately.
  • keep — the keys keep working and are reassigned to the caller.
There is no default. An integrator must not take down production integrations by omission. Revoking is never a delete: the record survives so message and call history keeps pointing somewhere real.