Usage by API key

⚠️
Preview — this feature is being built; the design below is the spec.
GET https://app.syntic.ai/v1/organizations/analytics/api_keys

Requests, tokens and spend per API key and service account for a period, sorted by spend. Keys that made no requests are left out unless include_idle=true, which is how you find keys to retire.

For how this fits into a full workflow, see Usage analytics.

Headers

HeaderRequiredValue
AuthorizationYesBearer <admin key>: an Admin API key (sk_admin_...). Inference keys are refused with 403 admin_key_required. See Admin API keys.
syntic-betaYes, while in previewadmin-2026-11-01. Without it the call fails with 400 beta_required. See Versioning.

Query parameters

ParameterTypeDefaultDescription
starting_atstringRFC 3339; required. Inclusive.
ending_atstringnowExclusive. At most 92 days after starting_at.
workspace_idstringRestrict to one workspace.
include_idlebooleanfalseAlso list keys with no traffic.
limitinteger501 to 500.

Response

200 OK, Content-Type: application/json

{
  "data": [
    {
      "api_key_id": "apikey_01JA0B2D4F6H8K0M2P4R",
      "name": "support-bot-prod",
      "owner": {
        "type": "service_account",
        "id": "svcacct_01JCH7K9M1P3R5T7V9X1"
      },
      "requests": 402114,
      "input_tokens": 1810022410,
      "output_tokens": 90221004,
      "cost_usd": "5520.10",
      "last_used_at": "2026-10-31T23:59:58Z"
    },
    {
      "api_key_id": "apikey_01JA0C3E5G7J9L1N3Q5S",
      "name": "old-prototype",
      "owner": {
        "type": "user",
        "id": "user_01J9Y0A2C4E6G8J0L2N4"
      },
      "requests": 0,
      "input_tokens": 0,
      "output_tokens": 0,
      "cost_usd": "0.00",
      "last_used_at": "2026-06-14T10:12:00Z"
    }
  ],
  "has_more": false
}
FieldTypeDescription
ownerobjectThe member or service account that owns the key.
last_used_atstring or nullCan be before the range for idle keys.

Examples

curl -sS "https://app.syntic.ai/v1/organizations/analytics/api_keys?starting_at=2026-10-01T00:00:00Z&include_idle=true" \
  -H "Authorization: Bearer $SYNTIC_ADMIN_KEY" \
  -H "syntic-beta: admin-2026-11-01"

Errors

Errors use the error envelope and carry a request_id. Codes specific to this operation:

StatustypecodeWhen
400invalid_request_errorbeta_requiredThe syntic-beta header is missing.
401authentication_errorinvalid_api_keyThe admin key is missing, unknown, revoked or expired.
403permission_erroradmin_key_requiredAn inference key was used.
429rate_limit_errorrate_limitedToo many requests; wait for Retry-After. See Rate-limit headers.
Was this page helpful?