{
  "object": "coverage",
  "routes": [
    {
      "method": "GET",
      "path": "/",
      "kind": "real",
      "note": "the landing page (L1): what this router serves, linking onto the live surfaces (/models, /chat, /console, /security, /status)"
    },
    {
      "method": "GET",
      "path": "/security",
      "kind": "real",
      "note": "the security/trust page (L1): every capability claim names the live endpoint that proves it (reproducible-build digests, /attestation nonce echo — always simulated:true, retention posture); unshipped work labeled roadmap"
    },
    {
      "method": "GET",
      "path": "/assets/{file}",
      "kind": "real",
      "note": "embedded front-door css — served from the binary, self-contained (no external fetches)"
    },
    {
      "method": "GET",
      "path": "/health",
      "kind": "real"
    },
    {
      "method": "GET",
      "path": "/status",
      "kind": "real",
      "note": "the human status page (J3): split SLO classes — router core vs control plane"
    },
    {
      "method": "GET",
      "path": "/status.json",
      "kind": "real",
      "note": "machine status: per-class states + rolling windows over ingested monitor cycles + control-plane signals"
    },
    {
      "method": "GET",
      "path": "/status/history",
      "kind": "real",
      "note": "the bounded ring of past monitor cycles, newest first"
    },
    {
      "method": "GET",
      "path": "/leaderboard.json",
      "kind": "real",
      "note": "the provider leaderboard (J4): per-route p50/p95 TTFT, throughput, uptime and error rate — a synthetic lane (monitor cycles) and an observed lane (real traffic), clearly labeled; nearest-rank percentiles over bounded windows, and any stat backed by too few samples answers insufficient_data, never a fake number"
    },
    {
      "method": "GET",
      "path": "/console",
      "kind": "real",
      "note": "the signed-in console shell (K1): session-gated server-side — no live session redirects to /console/signin; sections welcome (the A2 first-run onboarding flow) / keys / credits / activity / byok / settings"
    },
    {
      "method": "GET",
      "path": "/console/signin",
      "kind": "real",
      "note": "the console sign-in page (public): posts the identity hook's credential to /v1/auth/signin"
    },
    {
      "method": "GET",
      "path": "/console/assets/{file}",
      "kind": "real",
      "note": "embedded console css/js — served from the binary, self-contained (no external fetches)"
    },
    {
      "method": "GET",
      "path": "/chat",
      "kind": "real",
      "note": "the chat playground (K5): public page — spending rides the session's scoped browser key (POST /v1/auth/browser-key) and streams through the public POST /v1/chat/completions SSE wire"
    },
    {
      "method": "GET",
      "path": "/chat/assets/{file}",
      "kind": "real",
      "note": "embedded playground css/js — served from the binary, self-contained (no external fetches)"
    },
    {
      "method": "GET",
      "path": "/models",
      "kind": "real",
      "note": "the model catalog page (K6): public — renders client-side from GET /v1/models (prices, privacy tiers with citation links, jurisdiction); #<id> deep-links a model row"
    },
    {
      "method": "GET",
      "path": "/models/assets/{file}",
      "kind": "real",
      "note": "embedded catalog css/js — served from the binary, self-contained (no external fetches)"
    },
    {
      "method": "GET",
      "path": "/docs",
      "kind": "real",
      "note": "the API reference hub (L2): public — renders client-side from GET /openapi.json, so the page and the wire can never disagree; no CDN viewer, fully self-contained"
    },
    {
      "method": "GET",
      "path": "/docs/migrate",
      "kind": "real",
      "note": "the migrate-from-other-routers one-pager (L2): base-URL swap, key format, class-mode + meta ids, the x-iig-* response headers"
    },
    {
      "method": "GET",
      "path": "/docs/routing",
      "kind": "real",
      "note": "the routing help page (A5): postures, privacy floors, provider preferences, and how to read GET /v1/route-preview's ladder + reason chain"
    },
    {
      "method": "GET",
      "path": "/docs/assets/{file}",
      "kind": "real",
      "note": "embedded docs css/js — served from the binary, self-contained (no external fetches)"
    },
    {
      "method": "GET",
      "path": "/openapi.json",
      "kind": "real",
      "note": "the OpenAPI 3.0.3 document (L2), generated from this very route table — a served route missing from the spec is impossible by construction"
    },
    {
      "method": "GET",
      "path": "/llms.txt",
      "kind": "real",
      "note": "the agent-onboarding index (L3): what this router is, the key endpoints, where the spec and docs live — generated from this route table, every link same-origin"
    },
    {
      "method": "GET",
      "path": "/llms-full.txt",
      "kind": "real",
      "note": "the expanded llms.txt (L3): the index plus the essential wire documentation — inference request/response shapes from the OpenAPI schemas and the complete generated route list"
    },
    {
      "method": "GET",
      "path": "/compliance.json",
      "kind": "real",
      "note": "the compliance packet (L4): machine-readable procurement answers scoped to what is TRUE for this deployment — subprocessors derived live from the configured providers (never a hand-maintained list), retention posture with citations, status/SLO pointers, contact (or its honest absence)"
    },
    {
      "method": "GET",
      "path": "/v1/models",
      "kind": "real",
      "note": "catalog + live pricing + class-mode ids"
    },
    {
      "method": "GET",
      "path": "/v1/models/chooser",
      "kind": "real",
      "note": "the compact chooser payload (K6): the machine-readable subset a client model picker fetches in one call — same walk as the listing, shape documented in modelsui.go"
    },
    {
      "method": "GET",
      "path": "/v1/endpoints/zdr",
      "kind": "real",
      "note": "the ZDR eligibility report (F4): served routes at tier zdr or above, each with the policy citation that earned it"
    },
    {
      "method": "GET",
      "path": "/v1/route-preview",
      "kind": "real",
      "note": "routing transparency (A5): ?model=<id|class/<name>|meta alias> answers the resolved candidate ladder AT THIS ACCOUNT's posture and stored preferences — would-serve head, effective prices, privacy tiers, H6 health, a machine-readable reason chain and per-candidate exclusion attribution; read-only (no reserve, no dispatch); ?posture= previews a settings change before saving; the same resolver serving rides, so preview and dispatch cannot disagree"
    },
    {
      "method": "POST",
      "path": "/v1/chat/completions",
      "kind": "real",
      "note": "OpenAI chat wire; class/<name> ids route by class; :nitro/:floor id suffixes select the H7 route sort"
    },
    {
      "method": "POST",
      "path": "/v1/messages",
      "kind": "real",
      "note": "Anthropic Messages wire; tools translate both ways — declarations, tool_use/tool_result blocks, tool_choice, streamed tool_use deltas included (server tool types refuse: the router runs no tools)"
    },
    {
      "method": "POST",
      "path": "/v1/responses",
      "kind": "real",
      "note": "OpenAI Responses wire; tools and structured output refuse 400 (not yet served on this surface — the chat and Messages doors carry tools)"
    },
    {
      "method": "POST",
      "path": "/v1/embeddings",
      "kind": "real",
      "note": "input-only billing; <= 16 inputs"
    },
    {
      "method": "GET",
      "path": "/v1/account",
      "kind": "real"
    },
    {
      "method": "GET",
      "path": "/v1/account/authority",
      "kind": "real",
      "note": "the AUTHORITY balance (A1): the canister-held number the customer portal shows, proxied via the router's registered principal; local mode answers source 'local' — this router's ledger IS the authority there"
    },
    {
      "method": "GET",
      "path": "/v1/account/accounting",
      "kind": "real"
    },
    {
      "method": "GET",
      "path": "/v1/generation",
      "kind": "real",
      "note": "per-generation billing metadata (?id=, from x-iig-generation-id); bounded retention"
    },
    {
      "method": "GET",
      "path": "/v1/generation/content",
      "kind": "real",
      "note": "always answers content_not_stored — the router retains no transcripts"
    },
    {
      "method": "POST",
      "path": "/v1/account/preferences",
      "kind": "real"
    },
    {
      "method": "POST",
      "path": "/v1/account/provider-prefs",
      "kind": "real",
      "note": "default routing preferences (K4): the H2 routing block {order, only, ignore, allow_fallbacks, sort} stored per account and applied when a request carries none; {} clears"
    },
    {
      "method": "POST",
      "path": "/v1/account/topup",
      "kind": "real",
      "note": "top-up checkout via the adapter seam (E5); the dev adapter returns the signed webhook delivery"
    },
    {
      "method": "POST",
      "path": "/v1/checkout/webhook",
      "kind": "real",
      "note": "processor webhook door: a verified delivery credits the balance exactly once per checkout id"
    },
    {
      "method": "POST",
      "path": "/v1/account/refill",
      "kind": "real",
      "note": "auto-refill policy (E6): {thresholdUsd, amountUsd} — settles below threshold charge amount through the checkout seam, exactly once per crossing; {} disables"
    },
    {
      "method": "POST",
      "path": "/v1/account/limits",
      "kind": "real",
      "note": "spend-window limits (E3): the body replaces the account's fixed UTC day/week/month caps wholesale; {} clears them"
    },
    {
      "method": "POST",
      "path": "/v1/account/alerts",
      "kind": "real",
      "note": "spend alerts (A4): {webhookUrl?, secret?, lowBalanceUsd?, lowBalanceOff?} replaces the alert config wholesale; {} clears. Crossing 80%/100% of any window/cap or the low-balance line fires once per crossing per period - in the account's alerts view and, when configured, a signed metadata-only webhook POST"
    },
    {
      "method": "POST",
      "path": "/v1/account/transfer",
      "kind": "real",
      "note": "account-to-account credit transfer (E7): escrowed, exactly-once, idempotent by idempotencyKey; local mode only"
    },
    {
      "method": "GET",
      "path": "/v1/groupbuys",
      "kind": "real",
      "note": "group-buy goals (E8): the aggregate view — totals, tier progress, opted-in public messages — plus the caller's own pledges"
    },
    {
      "method": "POST",
      "path": "/v1/groupbuys/{id}/pledge",
      "kind": "real",
      "note": "escrow balance toward a goal, idempotent by idempotencyKey; goal-met settles the tiers; local mode only"
    },
    {
      "method": "POST",
      "path": "/v1/groupbuys/{id}/withdraw",
      "kind": "real",
      "note": "return an active pledge exactly (before goal-met); idempotent"
    },
    {
      "method": "GET",
      "path": "/v1/byok/providers",
      "kind": "real",
      "note": "BYOK keys (G2): the caller's own stored provider keys — masked hints + route preference, never material; Features.BYOK-gated"
    },
    {
      "method": "*",
      "path": "/v1/byok/providers/{slug}",
      "kind": "real",
      "note": "PUT {key, prefer?} seals a provider key (G1 envelopes); usage_type 'byok' (or prefer) then dispatches with it — no markup, usage rows still meter; DELETE removes key + preference atomically"
    },
    {
      "method": "GET",
      "path": "/v1/custom-models",
      "kind": "real",
      "note": "custom models (B6): the caller's account-scoped system-prompt wrappers over concrete chat models — 10 per account"
    },
    {
      "method": "*",
      "path": "/v1/custom-models/{slug}",
      "kind": "real",
      "note": "PUT {base, system_prompt} stores a wrapper (256 KiB prompt cap; base must be a chat catalog row — never class/meta/preset/custom ids); chatting with 'iig/user-{slug}' resolves to the base with the prompt prepended, billed at the base sheet"
    },
    {
      "method": "*",
      "path": "/v1/keys",
      "kind": "real",
      "note": "key lifecycle (D2): GET lists, POST mints — key material shown once"
    },
    {
      "method": "*",
      "path": "/v1/keys/{hash}",
      "kind": "real",
      "note": "PATCH label/disable/spend cap, DELETE removes"
    },
    {
      "method": "POST",
      "path": "/v1/auth/signin",
      "kind": "real",
      "note": "sessions (D3): identity-hook sign-in mints the session cookie"
    },
    {
      "method": "GET",
      "path": "/v1/auth/session",
      "kind": "real",
      "note": "the live session's envelope"
    },
    {
      "method": "POST",
      "path": "/v1/auth/browser-key",
      "kind": "real",
      "note": "the session's scoped browser key (D5): capped, expiring, rotating, inference-only"
    },
    {
      "method": "POST",
      "path": "/v1/auth/logout",
      "kind": "real",
      "note": "kills the session, clears the cookie"
    },
    {
      "method": "GET",
      "path": "/v1/oauth/apps/{clientId}",
      "kind": "real",
      "note": "public descriptor of one operator-registered OAuth app (D4): the consent screen's app name"
    },
    {
      "method": "POST",
      "path": "/v1/oauth/authorize",
      "kind": "real",
      "note": "consent (session cookie): S256 PKCE challenge + exact registered redirectUri in, single-use short-lived code out, state echoed verbatim"
    },
    {
      "method": "POST",
      "path": "/v1/oauth/token",
      "kind": "real",
      "note": "code + PKCE verifier in, the app's user-scoped INFERENCE-ONLY key out (a D2 row labeled with the app; management routes answer 403; codes burn on any attempt)"
    },
    {
      "method": "POST",
      "path": "/mcp",
      "kind": "real",
      "note": "the MCP server (streamable-HTTP transport, JSON-RPC 2.0, stateless): initialize / ping / tools/list / tools/call over an ordinary IIG bearer key. v1 tools are read + chat only — models-list, model-get, credits-get, generation-get, route-preview, docs-search, chat-send — each mapped onto the router's own wire (chat-send IS the chat door: same billing, same scoping); buffered JSON replies, no SSE frames; discovery at GET /.well-known/mcp.json"
    },
    {
      "method": "GET",
      "path": "/.well-known/mcp.json",
      "kind": "real",
      "note": "MCP discovery: the server card — endpoint, transport, auth style, protocol version, and the v1 tool list; public, every path same-origin relative"
    },
    {
      "method": "GET",
      "path": "/coverage",
      "kind": "real",
      "note": "this map"
    },
    {
      "method": "GET",
      "path": "/providers/marketplace/catalog.schema.json",
      "kind": "real",
      "note": "the provider marketplace contract (B7): the JSON Schema a would-be provider's catalog must conform to — public, so a candidate fetches the contract from any running router"
    },
    {
      "method": "POST",
      "path": "/v1/audio/speech",
      "kind": "stub",
      "note": "speech synthesis is not served"
    },
    {
      "method": "POST",
      "path": "/v1/audio/transcriptions",
      "kind": "stub",
      "note": "audio transcription is not served"
    },
    {
      "method": "POST",
      "path": "/v1/audio/translations",
      "kind": "stub",
      "note": "audio translation is not served"
    },
    {
      "method": "POST",
      "path": "/v1/rerank",
      "kind": "stub",
      "note": "reranking is not served"
    },
    {
      "method": "POST",
      "path": "/v1/moderations",
      "kind": "stub",
      "note": "moderation is not served"
    },
    {
      "method": "POST",
      "path": "/v1/images/generations",
      "kind": "stub",
      "note": "image generation is not served"
    },
    {
      "method": "POST",
      "path": "/v1/images/edits",
      "kind": "stub",
      "note": "image editing is not served"
    },
    {
      "method": "POST",
      "path": "/v1/images/variations",
      "kind": "stub",
      "note": "image variation is not served"
    },
    {
      "method": "*",
      "path": "/v1/batches",
      "kind": "stub",
      "note": "the batch API is not served"
    },
    {
      "method": "*",
      "path": "/v1/files",
      "kind": "stub",
      "note": "file storage is not served"
    }
  ],
  "service": "iig"
}