Team and API keys¶
Members, roles, invitations and keys.
| Endpoint | |
|---|---|
GET /members |
Your team |
POST /members/invitations |
Invite a team member |
POST /members/:id/invitations |
Re-send an invitation |
POST /invitations/accept |
Accept an invitation |
PATCH /members/:id |
Change a member's role |
DELETE /members/:id |
Revoke a member |
POST /members/me/api-key |
Issue your own member API key |
POST /api-keys/rotate |
Rotate the organization API key |
GET /members¶
Your team.
Auth: API key · Permission: member.read (owner, admin) · Rate limit: read
Responses
| Status | Meaning | error codes |
|---|---|---|
200 |
OK | |
401 |
Missing or invalid credentials | unauthorized |
403 |
Not allowed | forbidden |
429 |
Rate limited | rate_limited |
501 |
Not available on this environment | not_implemented |
200 body
| Field | Type | Always present | Notes |
|---|---|---|---|
members |
object[] | yes | |
members[].id |
string | yes | |
members[].email |
string | yes | |
members[].name |
string or null | yes | |
members[].role |
IntegratorRole | yes | |
members[].status |
string | yes | |
members[].invitedAt |
string | yes | |
members[].acceptedAt |
string or null | yes | |
members[].createdAt |
string | yes | |
count |
number | yes |
POST /members/invitations¶
Invite a team member.
Auth: API key · Permission: member.invite (owner, admin) · Rate limit: write
You can only grant a role below your own. The invitation is emailed; emailDelivered says whether it was.
Request body · application/json · unknown fields are rejected with 400
| Field | Type | Required | Rules | Notes |
|---|---|---|---|---|
email |
string (email) | yes | at most 320 chars | |
name |
string | no | 1–200 chars | |
role |
string | yes |
Responses
| Status | Meaning | error codes |
|---|---|---|
201 |
Created | |
400 |
Invalid request | validation |
401 |
Missing or invalid credentials | unauthorized |
403 |
Not allowed | forbidden |
409 |
Conflict | conflict |
429 |
Rate limited | rate_limited |
501 |
Not available on this environment | not_implemented |
201 body
| Field | Type | Always present | Notes |
|---|---|---|---|
emailDelivered |
boolean | yes | |
emailError |
string | no | |
member |
object | yes | |
member.id |
string | yes | |
member.email |
string | yes | |
member.name |
string or null | yes | |
member.role |
IntegratorRole | yes | |
member.status |
string | yes | |
member.invitedAt |
string | yes | |
member.acceptedAt |
string or null | yes | |
member.createdAt |
string | yes |
POST /members/:id/invitations¶
Re-send an invitation.
Auth: API key · Permission: member.invite (owner, admin) · Rate limit: write
Issues a fresh link; the old one stops working.
Path parameters
| Name | Type |
|---|---|
id |
string |
Responses
| Status | Meaning | error codes |
|---|---|---|
200 |
OK | |
401 |
Missing or invalid credentials | unauthorized |
403 |
Not allowed | forbidden |
404 |
Not found, or not yours | not_found |
429 |
Rate limited | rate_limited |
501 |
Not available on this environment | not_implemented |
200 body
| Field | Type | Always present | Notes |
|---|---|---|---|
emailDelivered |
boolean | yes | |
emailError |
string | no | |
member |
object | yes | |
member.id |
string | yes | |
member.email |
string | yes | |
member.name |
string or null | yes | |
member.role |
IntegratorRole | yes | |
member.status |
string | yes | |
member.invitedAt |
string | yes | |
member.acceptedAt |
string or null | yes | |
member.createdAt |
string | yes |
POST /invitations/accept¶
Accept an invitation.
Auth: none
Open: the invitation token is the credential. Returns the new member's API key once.
Request body · application/json · unknown fields are rejected with 400
| Field | Type | Required | Rules | Notes |
|---|---|---|---|---|
token |
string | yes | 1–200 chars |
Responses
| Status | Meaning | error codes |
|---|---|---|
200 |
OK | |
400 |
Invalid request | invalid_invite, validation |
501 |
Not available on this environment | not_implemented |
200 body
| Field | Type | Always present | Notes |
|---|---|---|---|
apiKey |
string | yes | |
member |
object | yes | |
member.id |
string | yes | |
member.email |
string | yes | |
member.name |
string or null | yes | |
member.role |
IntegratorRole | yes | |
member.status |
string | yes | |
member.invitedAt |
string | yes | |
member.acceptedAt |
string or null | yes | |
member.createdAt |
string | yes |
PATCH /members/:id¶
Change a member's role.
Auth: API key · Permission: member.manage (owner, admin) · Rate limit: write
Path parameters
| Name | Type |
|---|---|
id |
string |
Request body · application/json · unknown fields are rejected with 400
| Field | Type | Required | Rules | Notes |
|---|---|---|---|---|
role |
string | yes |
Responses
| Status | Meaning | error codes |
|---|---|---|
200 |
OK | |
400 |
Invalid request | validation |
401 |
Missing or invalid credentials | unauthorized |
403 |
Not allowed | forbidden |
404 |
Not found, or not yours | not_found |
429 |
Rate limited | rate_limited |
501 |
Not available on this environment | not_implemented |
200 body
| Field | Type | Always present | Notes |
|---|---|---|---|
member |
object | yes | |
member.id |
string | yes | |
member.email |
string | yes | |
member.name |
string or null | yes | |
member.role |
IntegratorRole | yes | |
member.status |
string | yes | |
member.invitedAt |
string | yes | |
member.acceptedAt |
string or null | yes | |
member.createdAt |
string | yes |
DELETE /members/:id¶
Revoke a member.
Auth: API key · Permission: member.manage (owner, admin) · Rate limit: write
Path parameters
| Name | Type |
|---|---|
id |
string |
Responses
| Status | Meaning | error codes |
|---|---|---|
200 |
OK | |
401 |
Missing or invalid credentials | unauthorized |
403 |
Not allowed | forbidden |
404 |
Not found, or not yours | not_found |
429 |
Rate limited | rate_limited |
501 |
Not available on this environment | not_implemented |
200 body
| Field | Type | Always present | Notes |
|---|---|---|---|
member |
object | yes | |
member.id |
string | yes | |
member.email |
string | yes | |
member.name |
string or null | yes | |
member.role |
IntegratorRole | yes | |
member.status |
string | yes | |
member.invitedAt |
string | yes | |
member.acceptedAt |
string or null | yes | |
member.createdAt |
string | yes | |
rescinded |
boolean | yes |
POST /members/me/api-key¶
Issue your own member API key.
Auth: API key · Rate limit: write
For a signed-in member: mints a key carrying your existing role and revokes your previous one. Shown once. Not for the organization key; that is POST /api-keys/rotate.
Responses
| Status | Meaning | error codes |
|---|---|---|
200 |
OK | |
401 |
Missing or invalid credentials | unauthorized |
404 |
Not found, or not yours | not_found |
409 |
Conflict | member_required |
429 |
Rate limited | rate_limited |
501 |
Not available on this environment | not_implemented |
200 body
| Field | Type | Always present | Notes |
|---|---|---|---|
apiKey |
string | yes | |
member |
object | yes | |
member.id |
string | yes | |
member.email |
string | yes | |
member.name |
string or null | yes | |
member.role |
IntegratorRole | yes | |
member.status |
string | yes | |
member.invitedAt |
string | yes | |
member.acceptedAt |
string or null | yes | |
member.createdAt |
string | yes | |
rotatedAt |
string | yes |
POST /api-keys/rotate¶
Rotate the organization API key.
Auth: API key · Rate limit: write
Owner only, with the organization key. The new key is returned once and the key that made this request stops working immediately.
Responses
| Status | Meaning | error codes |
|---|---|---|
200 |
OK | |
401 |
Missing or invalid credentials | unauthorized |
403 |
Not allowed | forbidden |
404 |
Not found, or not yours | not_found |
429 |
Rate limited | rate_limited |
501 |
Not available on this environment | not_implemented |
200 body
| Field | Type | Always present | Notes |
|---|---|---|---|
apiKey |
string | yes | |
rotatedAt |
string | yes |