Invites
Invites bring new people into your organization. The API sends the same email invitation as Settings → Members → Invite in the Console; the person becomes a member when they accept. Use it to onboard a new team from a script or from your own HR or provisioning tool.
Endpoints
| Method | Path | Purpose |
|---|---|---|
POST | /v1/organizations/invites | Invite someone by email. |
GET | /v1/organizations/invites | List invites. |
GET | /v1/organizations/invites/{invite_id} | Read one. |
POST | /v1/organizations/invites/{invite_id}/resend | Send the email again with a fresh link. |
DELETE | /v1/organizations/invites/{invite_id} | Cancel a pending invite. |
Authenticate with an admin key and send syntic-beta: admin-2026-11-01. Keys created by Owners and Administrators may invite.
The invite object
{
"id": "invite_01JCD3F5H7K9M1P3R5T7",
"type": "invite",
"email": "sam@example.com",
"role": "developer",
"workspaces": [{ "workspace_id": "wrkspc_01JC0A2C4E6G8J0L2N4Q", "role": "workspace_developer" }],
"status": "pending",
"invited_by": { "id": "user_01J9...", "email": "ops@example.com" },
"created_at": "2026-11-05T10:00:00Z",
"expires_at": "2026-11-12T10:00:00Z",
"accepted_at": null
}| Field | Values |
|---|---|
role | administrator or developer. Owners are never created by invitation. |
workspaces | Workspaces to add the person to on acceptance, with a workspace role each. Optional. |
status | pending, accepted, expired or canceled. |
expires_at | 7 days after creation or the latest resend. |
Create an invite
POST /v1/organizations/invites
| Field | Required | Notes |
|---|---|---|
email | Yes | One address per call. |
role | No | Default developer. |
workspaces | No | Up to 20 entries. |
curl -sS https://app.syntic.ai/v1/organizations/invites \
-H "Authorization: Bearer $SYNTIC_ADMIN_KEY" \
-H "Content-Type: application/json" \
-H "syntic-beta: admin-2026-11-01" \
-d '{"email": "sam@example.com", "role": "developer",
"workspaces": [{"workspace_id": "wrkspc_01JC0A2C4E6G8J0L2N4Q", "role": "workspace_developer"}]}'Response 201 Created with the invite. Inviting an address that already has a pending invite returns the existing invite with 200 OK rather than sending a second email; use /resend to send again.
Accepting
The invitee follows the link in the email, signs in or creates a Syntic account with that address, and becomes an active member with the invited role. Until then they cannot create keys or see anything in the organization. If your organization enforces single sign-on, they must sign in through your identity provider.
List, resend, cancel
GET /v1/organizations/invitessupportsstatus(defaultpending),emailand cursor pagination.POST .../resendissues a fresh link and movesexpires_at7 days forward. At most 5 resends per invite.DELETE .../{invite_id}cancels a pending invite; the link stops working. Returns{"id": "...", "type": "invite_deleted"}.
Each action writes an audit event: member.invited, member.invite_resent, member.invite_canceled, and member.joined on acceptance.
Errors
Errors use the error envelope.
| Status | type | code | When |
|---|---|---|---|
| 400 | invalid_request_error | invalid_email | Not a valid address. |
| 400 | invalid_request_error | invalid_role | Anything other than administrator or developer. |
| 403 | permission_error | role_required | The key’s creator may not invite. |
| 403 | permission_error | email_domain_not_allowed | The organization restricts members to certain email domains. |
| 404 | not_found_error | invite_not_found | No such invite. |
| 409 | conflict_error | already_member | The address belongs to an active member. |
| 409 | conflict_error | invite_not_pending | Resend or cancel on an accepted, expired or canceled invite. |
| 409 | conflict_error | seat_limit_reached | The plan has no free seats. |
| 429 | rate_limit_error | rate_limited | More than 100 invites per hour per organization. |
Build notes for the platform team
- Thin wrapper over the existing invite and resend functions; keep the takeover guard that prevents an invite from overwriting an existing member’s row.
- The 7-day expiry belongs to the invite record; the email link itself is re-issued on each resend.