Send (or refresh) an invite
OWNER-only. Idempotent refresh-or-create: an existing PENDING invite to the same email is updated in place (TTL reset, role swapped, email re-fired). Email send is fire-and-forget — the invite row exists regardless of SMTP outcome. Per-sender rate-limit (`INVITE_DAILY_LIMIT = 100/day`) returns `429` when capped.
/api/organizations/{orgId}/invitesOWNER-only. Idempotent refresh-or-create: an existing PENDING invite to the same email is updated in place (TTL reset, role swapped, email re-fired). Email send is fire-and-forget — the invite row exists regardless of SMTP outcome. Per-sender rate-limit (INVITE_DAILY_LIMIT = 100/day) returns 429 when capped.
Path Parameters
Organisation id (cuid)
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
curl -X POST "https://loading/api/organizations/string/invites" \ -H "Content-Type: application/json" \ -d '{ "email": "teammate@your-company.com", "role": "ADMIN" }'{
"id": "inv_k4l5m6n7",
"email": "teammate@your-company.com",
"role": "ADMIN"
}List outstanding invites for the org GET
OWNER-only — invite lifecycle is governance. Past-TTL rows are filtered out lazily and flipped to `EXPIRED` in the background.
Edit a pending invite PATCH
OWNER-only. Discriminated body — `{ action: 'change-role', role }` updates the role, `{ action: 'extend' }` resets the TTL and re-attributes the inviter to the acting user.