anthropic_admin
Manage Anthropic organization members, invites, workspaces, workspace members, API keys, usage and cost reports, Claude Code analytics and rate limits using SQL.
For the user/inference surface (messages, models, batches, files, skills, agents, sessions, memory stores, dreams, vaults) use the anthropic provider - it authenticates with a separate, workspace-scoped API key.
total services: 6
total resources: 17
source project: stackql-provider-anthropic
See also: [SHOW] [DESCRIBE] [REGISTRY]
Installation​
REGISTRY PULL anthropic_admin;
Authentication​
The anthropic_admin provider authenticates with an org-scoped Admin API key (sk-ant-admin01-...) sent in the x-api-key header. Set the following environment variable:
ANTHROPIC_ADMIN_KEY- an Admin API key, created in Claude Console > Settings > Admin keys
Only organization members with the admin role can provision Admin API keys, and the Admin API is unavailable for individual (non-organization) accounts. Admin keys and regular Claude API keys are disjoint: neither can call the other's endpoints. The required anthropic-version header is sent automatically (default 2023-06-01).
On the Claude Platform on AWS only the workspace endpoints (create, get, list, update, archive) are available; organization members, invites, API keys, reports and rate limits are not.
Example Queries​
Try the following queries using stackql shell, or run them from a script or CI pipeline with stackql exec.
Token usage and cost as rows​
Usage and cost reports are bucketed time series. Each row is one time bucket (starting_at, ending_at) whose results column holds the per-group breakdown, fanned out with JSON_EACH and read with JSON_EXTRACT.
Token usage by model:
SELECT
u.starting_at,
JSON_EXTRACT(r.value, '$.model') AS model,
JSON_EXTRACT(r.value, '$.uncached_input_tokens') AS input_tokens,
JSON_EXTRACT(r.value, '$.cache_read_input_tokens') AS cache_read_tokens,
JSON_EXTRACT(r.value, '$.output_tokens') AS output_tokens
FROM anthropic_admin.usage.usage_reports u, JSON_EACH(u.results) r
WHERE u.starting_at = '2026-07-01T00:00:00Z'
ORDER BY u.starting_at;
Spend in USD, per line item:
SELECT
c.starting_at,
JSON_EXTRACT(r.value, '$.description') AS line_item,
JSON_EXTRACT(r.value, '$.currency') AS currency,
JSON_EXTRACT(r.value, '$.amount') AS amount
FROM anthropic_admin.cost.cost_reports c, JSON_EACH(c.results) r
WHERE c.starting_at = '2026-07-01T00:00:00Z'
ORDER BY c.starting_at;
Reports are grouped and filtered on the wire. Bracketed parameter names are addressed with double quotes, and take one value per query:
SELECT starting_at, results
FROM anthropic_admin.usage.usage_reports
WHERE starting_at = '2026-07-01T00:00:00Z'
AND "group_by[]" = 'model';
Claude Code adoption​
Who is using Claude Code, from where, and what it produced:
SELECT
date,
terminal_type,
JSON_EXTRACT(actor, '$.email_address') AS user_email,
JSON_EXTRACT(core_metrics, '$.num_sessions') AS sessions,
JSON_EXTRACT(core_metrics, '$.lines_of_code.added') AS lines_added,
JSON_EXTRACT(core_metrics, '$.commits_by_claude_code') AS commits
FROM anthropic_admin.usage.claude_code_reports
WHERE starting_at = '2026-07-01'
ORDER BY date;
Governance​
Active workspaces and who is in them:
SELECT
w.name AS workspace,
m.user_id,
m.workspace_role
FROM anthropic_admin.workspaces.workspaces w
JOIN anthropic_admin.workspaces.members m
ON m.workspace_id = w.id
WHERE w.archived_at IS NULL
ORDER BY w.name, m.workspace_role;
The workspace id values (wrkspc_...) are what the anthropic provider takes as its optional anthropic-workspace-id parameter to scope an inference or resource query to one workspace.
API key inventory - which workspace each key belongs to, who created it, and whether it is still active:
SELECT
id,
name,
workspace_id,
status,
partial_key_hint,
created_at,
JSON_EXTRACT(created_by, '$.id') AS created_by
FROM anthropic_admin.api_keys.api_keys
ORDER BY created_at;
Rate limits​
The organization's limits, one row per limit per model group:
SELECT
rl.group_type,
JSON_EXTRACT(rl.models, '$[0]') AS model,
JSON_EXTRACT(l.value, '$.type') AS limit_type,
JSON_EXTRACT(l.value, '$.value') AS limit_value
FROM anthropic_admin.rate_limits.rate_limits rl, JSON_EACH(rl.limits) l
ORDER BY rl.group_type;