Admin API and admin keys
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 key | Admin key | |
|---|---|---|
| Prefix | sk_live_ | sk_admin_ |
Calls models (/v1/chat/completions and other model endpoints) | Yes | No: 403 inference_not_allowed |
| Calls workspace resources (agents, files, batches, webhooks) | Yes, in its workspace | No |
Calls /v1/organizations/* | No: 403 admin_key_required | Yes |
| Scope | One workspace | The whole organization |
| Who may create | Any member with key permission | Owners and Administrators only |
| Audit | Creation and revocation | Creation, 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, codeadmin_key_owner_ineligible. Replace it under a current Owner or Administrator.
Calling the Admin API
| Item | Value |
|---|---|
| Base URL | https://app.syntic.ai/v1/organizations |
| Authentication | Authorization: Bearer sk_admin_... |
| Preview header | syntic-beta: admin-2026-11-01 |
| Format | JSON in and out; lists use cursor pagination |
| Errors | The error envelope |
| Rate limit | 300 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
| Page | Endpoints |
|---|---|
| Organization info | GET, 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
| Method | Path | Purpose |
|---|---|---|
GET | /v1/organizations/admin_keys | List 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
| Status | type | code | When |
|---|---|---|---|
| 401 | authentication | invalid_api_key, revoked_api_key | The admin key is unknown or revoked. |
| 403 | permission_error | admin_key_required | An inference key was sent to /v1/organizations/*. |
| 403 | permission_error | inference_not_allowed | An admin key was sent to a model or workspace endpoint. |
| 403 | permission_error | admin_key_owner_ineligible | The key’s creator is no longer an Owner or Administrator. |
| 403 | permission_error | role_required | The creator’s role does not allow this change (for example, an Administrator’s key changing an Owner). |
| 403 | permission_error | ip_not_allowed | The request came from outside the key’s IP allowlist. |
| 429 | rate_limit_error | rate_limited | More 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
kindcolumn (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.