Admin API and admin keys

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

With the Admin API, code can manage your Syntic organization: workspaces, members, invites, API keys, spend limits, and usage, cost and audit reports. Everything lives under /v1/organizations/*, and every call needs a special credential, an admin key, that can manage the organization but can never call a model.

Keeping the two kinds of key apart means a leaked inference key cannot change who is in your organization, and a leaked admin key cannot run up a model bill.

Admin keys at a glance

Inference keyAdmin key
Prefixsk_live_sk_admin_
Calls models (/v1/chat/completions and other model endpoints)YesNo: 403 inference_not_allowed
Calls workspace resources (agents, files, batches, webhooks)Yes, in its workspaceNo
Calls /v1/organizations/*No: 403 admin_key_requiredYes
ScopeOne workspaceThe whole organization
Who may createAny member with key permissionOwners and Administrators only
AuditCreation and revocationCreation, revocation, and every request

Create an admin key

Open admin keys

In the Console, go to Settings → Admin keys. The page is visible to Owners and Administrators only.

Name it and confirm

Give the key a name that says what will use it, such as terraform-org or finance-cost-export. You will be asked to confirm with your second factor. Optionally restrict it to a list of IP addresses (see IP allowlists); for admin keys this is strongly recommended.

Copy the secret

sk_admin_ followed by 64 hexadecimal characters. It is shown once.

Admin keys cannot be created through the API. This is deliberate: an admin key that could mint more admin keys would make a leak impossible to contain.

Whose authority a key carries

An admin key acts with its creator’s current role:

  • Keys made by an Owner can do everything in the Admin API.
  • Keys made by an Administrator can do what an Administrator can do in the Console. They cannot, for example, change an Owner’s role or another Administrator’s role.
  • If the creator stops being an Owner or Administrator, or leaves, the key stops working with 403 permission, code admin_key_owner_ineligible. Replace it under a current Owner or Administrator.

Calling the Admin API

ItemValue
Base URLhttps://app.syntic.ai/v1/organizations
AuthenticationAuthorization: Bearer sk_admin_...
Preview headersyntic-beta: admin-2026-11-01
FormatJSON in and out; lists use cursor pagination
ErrorsThe error envelope
Rate limit300 requests a minute for each organization
export SYNTIC_ADMIN_KEY="sk_admin_..."
 
curl -sS https://app.syntic.ai/v1/organizations/me \
  -H "Authorization: Bearer $SYNTIC_ADMIN_KEY" \
  -H "syntic-beta: admin-2026-11-01"

What the Admin API covers

PageEndpoints
Organization infoGET, PATCH /me
Workspaces/workspaces, /workspaces/{id}/members
Members/users
Invites/invites
API key management/api_keys
Usage report/usage_report/messages
Cost report/cost_report
Rate-limit info/rate_limits
Spend limits/spend_limits
Audit feed/audit_events
Syntic Code usage/code_analytics

Organization-level settings for inference hooks, customer-managed keys, webhooks and data retention are documented on those pages.

Managing admin keys

MethodPathPurpose
GET/v1/organizations/admin_keysList admin keys: id, name, prefix, creator, created, last used, status.
GET/v1/organizations/admin_keys/{key_id}One key.
PATCH/v1/organizations/admin_keys/{key_id}Change name, allowed_ips, or status (active / inactive).
{
  "id": "adminkey_01JCC2E4G6J8L0N2Q4S6",
  "type": "admin_key",
  "name": "terraform-org",
  "prefix": "sk_admin_7d3e",
  "status": "active",
  "created_by": { "id": "user_01J9...", "email": "ops@example.com", "role": "owner" },
  "allowed_ips": ["203.0.113.0/24"],
  "created_at": "2026-11-01T09:00:00Z",
  "last_used_at": "2026-11-05T02:00:13Z"
}

Revoking (deleting) an admin key is done in the Console. Setting it inactive through the API takes effect at once and can be undone.

Audit of every request

Each Admin API request writes an audit event admin_api.request with the key id, method, path, status, IP address and request ID. Writes also produce their own specific events, such as member.change_role or workspace.archived. Read them with the audit feed.

Errors

StatustypecodeWhen
401authenticationinvalid_api_key, revoked_api_keyThe admin key is unknown or revoked.
403permission_erroradmin_key_requiredAn inference key was sent to /v1/organizations/*.
403permission_errorinference_not_allowedAn admin key was sent to a model or workspace endpoint.
403permission_erroradmin_key_owner_ineligibleThe key’s creator is no longer an Owner or Administrator.
403permission_errorrole_requiredThe creator’s role does not allow this change (for example, an Administrator’s key changing an Owner).
403permission_errorip_not_allowedThe request came from outside the key’s IP allowlist.
429rate_limit_errorrate_limitedMore than 300 requests per minute.

Good practice

  • One admin key per automation, named after it.
  • Always set an IP allowlist on admin keys.
  • Store admin keys in a secret manager with tighter access than inference keys.
  • Review Last used monthly and revoke keys that are idle.

Build notes for the platform team

  • Add a kind column (inference, admin) to the key table; do not create a second table. The auth step routes by kind before any handler runs.
  • Resolve the creator’s role on every request (cached for 60 seconds) so demotion takes effect quickly.
  • Rate-limit the Admin API separately from inference traffic.
Was this page helpful?