Founding keys are opena year free at 6,000 req/hour, for the first 1,000 developersClaim yours
Documentation 29

Anthropic Admin API quickstart · 3 min read

The org telemetry your connector reads. No enterprise onboarding.

The Admin API surface engineering-intelligence tools document — members, workspaces, API-key metadata, usage & cost reports, and Claude Code analytics — for a simulated org whose numbers reconcile with its git history, exactly.

01Point your calls at anthropic.
02Send the version header
03Pin a snapshot for CI

01 / Base URL

The Admin API, mirrored.

Point requests at https://anthropic.sandboxapis.dev. Paths, envelopes, and both pagination families mirror api.anthropic.com — including the REQUIRED anthropic-version header (requests without it get the real API's 400, so your client's error handling exercises honestly).

request.sh
curl "https://anthropic.sandboxapis.dev/v1/organizations/usage_report/claude_code?starting_at=2026-05-01&limit=5" \
  -H 'x-api-key: any-key-works' \
  -H 'anthropic-version: 2023-06-01'

02 / Drop in the official SDK

@anthropic-ai/sdk works unmodified.

The only change is baseURL — pointed here at the pinned *.snap. host, so the values below are the values you get. The SDK injects auth and the version header itself, and its typed error classes fire on the sandbox's provider-shaped envelopes (a write raises PermissionDeniedError, as read-only should).

typescript
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({
  apiKey: "any-key-works",
  baseURL: "https://anthropic-2023-06.snap.sandboxapis.dev",
});

// The walk the connector docs name: analytics + the org roster.
const report = await client.get("/v1/organizations/usage_report/claude_code", {
  query: { starting_at: "2026-05-01", limit: 1000 },
});
const users = await client.get("/v1/organizations/users", { query: { limit: 100 } });

03 / A real response

Live from the universe.

200 · application/json
{
  "data": [
    {
      "date": "2026-05-02",
      "actor": {
        "type": "user_actor",
        "email_address": "hermes@olympus-labs.dev"
      },
      "organization_id": "506ffe58-5370-4311-a527-0017e5570063",
      "customer_type": "api",
      "terminal_type": "tmux",
      "core_metrics": {
        "num_sessions": 2,
        "lines_of_code": {
          "added": 87,
          "removed": 13
        },
        "commits_by_claude_code": 1,
        "pull_requests_by_claude_code": 0
      },
      "tool_actions": {
        "edit_tool": {
          "accepted": 9,
          "rejected": 1
        },
        "multi_edit_tool": {
          "accepted": 3,
          "rejected": 1
        },
        "write_tool": {
          "accepted": 2,
          "rejected": 1
        },
        "notebook_edit_tool": {
          "accepted": 0,
          "rejected": 0
        }
      },
      "model_breakdown": [
        {
          "model": "claude-haiku-4-5",
          "tokens": {
            "input": 70000,
            "output": 8000,
            "cache_read": 350000,
            "cache_creation": 3500
          },
          "estimated_cost": {
            "currency": "USD",
            "amount": 14.94
          }
        },
        {
          "model": "claude-sonnet-4-6",
          "tokens": {
            "input": 468000,
            "output": 51000,
            "cache_read": 2340000,
            "cache_creation": 23400
          },
          "estimated_cost": {
            "currency": "USD",
            "amount": 295.88
          }
        }
      ]
    },
    {
      "date": "2026-05-03",
      "actor": {
        "type": "user_actor",
        "email_address": "hermes@olympus-labs.dev"
      },
      "organization_id": "506ffe58-5370-4311-a527-0017e5570063",
      "customer_type": "api",
      "terminal_type": "tmux",
      "core_metrics": {
        "num_sessions": 3,
        "lines_of_code": {
          "added": 124,
          "removed": 19
        },
        "commits_by_claude_code": 1,
        "pull_requests_by_claude_code": 0
      },
      "tool_actions": {
        "edit_tool": {
          "accepted": 8,
          "rejected": 1
        },
        "multi_edit_tool": {
          "accepted": 3,
          "rejected": 1
        },
        "write_tool": {
          "accepted": 3,
          "rejected": 1
        },
        "notebook_edit_tool": {
          "accepted": 0,
          "rejected": 0
        }
      },
      "model_breakdown": [
        {
          "model": "claude-haiku-4-5",
          "tokens": {
            "input": 112000,
            "output": 9000,
            "cache_read": 224000,
            "cache_creation": 5600
          },
          "estimated_cost": {
            "currency": "USD",
            "amount": 18.64
          }
        },
        {
          "model": "claude-sonnet-4-6",
          "tokens": {
            "input": 818000,
            "output": 65000,
            "cache_read": 1636000,
            "cache_creation": 40900
          },
          "estimated_cost": {
            "currency": "USD",
            "amount": 407.32
          }
        }
      ]
    }
  ],
  "has_more": true,
  "next_page": "page_bzoy"
}

04 / Pin a snapshot

Deterministic CI.

The *.snap. baseURL is the whole of it — byte-identical on every request, with model IDs and pricing frozen at the pin's snapshot date. Your FinOps reconciliation logic gets a fixture that never moves.

.env
# reproducible in CI
export ANTHROPIC_BASE_URL=https://anthropic-2023-06.snap.sandboxapis.dev

Tour the universe → · Coverage manifest → · Versioning & pinning →