Invites

⚠️
Preview — this feature is being built; the design below is the spec.

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

MethodPathPurpose
POST/v1/organizations/invitesInvite someone by email.
GET/v1/organizations/invitesList invites.
GET/v1/organizations/invites/{invite_id}Read one.
POST/v1/organizations/invites/{invite_id}/resendSend 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
}
FieldValues
roleadministrator or developer. Owners are never created by invitation.
workspacesWorkspaces to add the person to on acceptance, with a workspace role each. Optional.
statuspending, accepted, expired or canceled.
expires_at7 days after creation or the latest resend.

Create an invite

POST /v1/organizations/invites

FieldRequiredNotes
emailYesOne address per call.
roleNoDefault developer.
workspacesNoUp 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/invites supports status (default pending), email and cursor pagination.
  • POST .../resend issues a fresh link and moves expires_at 7 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.

StatustypecodeWhen
400invalid_request_errorinvalid_emailNot a valid address.
400invalid_request_errorinvalid_roleAnything other than administrator or developer.
403permission_errorrole_requiredThe key’s creator may not invite.
403permission_erroremail_domain_not_allowedThe organization restricts members to certain email domains.
404not_found_errorinvite_not_foundNo such invite.
409conflict_erroralready_memberThe address belongs to an active member.
409conflict_errorinvite_not_pendingResend or cancel on an accepted, expired or canceled invite.
409conflict_errorseat_limit_reachedThe plan has no free seats.
429rate_limit_errorrate_limitedMore 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.
Was this page helpful?