{"endpoints":[{"method":"GET","path":"/health","authorization":"public","summary":"Process liveness without backing-service checks."},{"method":"GET","path":"/health/live","authorization":"public","summary":"Explicit process liveness alias."},{"method":"GET","path":"/health/ready","authorization":"public","summary":"PostgreSQL and Redis readiness; returns 503 when unavailable."},{"method":"GET","path":"/api/v1/health","authorization":"public","summary":"Versioned readiness check."},{"method":"GET","path":"/api/v1/network/status","authorization":"public","summary":"Privacy-safe aggregate Edge, site, member, and configured-capacity counters."},{"method":"GET","path":"/api/v1/reference","authorization":"public","summary":"Implemented route, scope, and error-code reference."},{"method":"GET","path":"/api/v1/auth/me","authorization":"bearer_api_key","summary":"Credential-derived organization and API scopes."},{"method":"GET","path":"/api/v1/sites","authorization":"bearer_api_key","summary":"List tenant sites with optional enabled filtering."},{"method":"POST","path":"/api/v1/sites","authorization":"bearer_api_key","summary":"Create a tenant site."},{"method":"GET","path":"/api/v1/sites/{site_id}","authorization":"bearer_api_key","summary":"Read one tenant site."},{"method":"PATCH","path":"/api/v1/sites/{site_id}","authorization":"bearer_api_key","summary":"Rename, enable, or disable one tenant site."},{"method":"GET","path":"/api/v1/teams","authorization":"bearer_api_key","summary":"List teams with optional site/enabled filtering."},{"method":"POST","path":"/api/v1/teams","authorization":"bearer_api_key","summary":"Create a tenant-owned operating team."},{"method":"GET","path":"/api/v1/teams/{team_id}","authorization":"bearer_api_key","summary":"Read one tenant-owned operating team."},{"method":"PATCH","path":"/api/v1/teams/{team_id}","authorization":"bearer_api_key","summary":"Update or disable a tenant-owned operating team."},{"method":"POST","path":"/api/v1/edge/pairings","authorization":"public","summary":"Start a short-lived Edge device pairing flow."},{"method":"POST","path":"/api/v1/edge/pairings/token","authorization":"public","summary":"Poll an Edge pairing and claim its device credential once approved."},{"method":"POST","path":"/api/v1/edge/pairings/{user_code}/approve","authorization":"bearer_api_key","summary":"Approve an Edge pairing for a tenant site."},{"method":"GET","path":"/api/v1/edge/devices","authorization":"bearer_api_key","summary":"List registered Edge devices for the tenant."},{"method":"PATCH","path":"/api/v1/edge/devices/{device_id}","authorization":"bearer_api_key","summary":"Update Edge site, status, name, or remote configuration."},{"method":"GET","path":"/api/v1/edge/me","authorization":"bearer_api_key","summary":"Return the Edge device bound to the presented device credential."},{"method":"POST","path":"/api/v1/edge/heartbeat","authorization":"bearer_api_key","summary":"Update Edge liveness, hardware inventory, and capabilities."},{"method":"GET","path":"/api/v1/edge/config","authorization":"bearer_api_key","summary":"Return remote configuration for the authenticated Edge device."},{"method":"GET","path":"/api/v1/agents","authorization":"bearer_api_key","summary":"List TerraSatch agents with site/profile/enabled filters."},{"method":"POST","path":"/api/v1/agents","authorization":"bearer_api_key","summary":"Create a site-scoped TerraSatch processing agent."},{"method":"GET","path":"/api/v1/agents/{agent_id}","authorization":"bearer_api_key","summary":"Read one TerraSatch processing agent."},{"method":"PATCH","path":"/api/v1/agents/{agent_id}","authorization":"bearer_api_key","summary":"Update or disable one TerraSatch processing agent."},{"method":"GET","path":"/api/v1/channels","authorization":"bearer_api_key","summary":"List logical monitored channels with filters."},{"method":"POST","path":"/api/v1/channels","authorization":"bearer_api_key","summary":"Create a logical monitored channel."},{"method":"GET","path":"/api/v1/channels/{channel_id}","authorization":"bearer_api_key","summary":"Read one logical monitored channel."},{"method":"PATCH","path":"/api/v1/channels/{channel_id}","authorization":"bearer_api_key","summary":"Update, reassign, or disable a logical channel."},{"method":"GET","path":"/api/v1/callsigns","authorization":"bearer_api_key","summary":"List configured callsigns and aliases with filters."},{"method":"POST","path":"/api/v1/callsigns","authorization":"bearer_api_key","summary":"Create a tenant-owned callsign."},{"method":"GET","path":"/api/v1/callsigns/{callsign_id}","authorization":"bearer_api_key","summary":"Read one tenant-owned callsign."},{"method":"PATCH","path":"/api/v1/callsigns/{callsign_id}","authorization":"bearer_api_key","summary":"Update bindings, aliases, or enabled state for a callsign."},{"method":"POST","path":"/api/v1/transmissions","authorization":"bearer_api_key","summary":"Ingest authorized text representing one radio transmission."},{"method":"GET","path":"/api/v1/transmissions","authorization":"bearer_api_key","summary":"List preserved source transmissions with source/site/agent/channel filters."},{"method":"GET","path":"/api/v1/transmissions/{transmission_id}","authorization":"bearer_api_key","summary":"Read one preserved source transmission."},{"method":"GET","path":"/api/v1/transcripts","authorization":"bearer_api_key","summary":"List preserved transcripts, optionally by transmission."},{"method":"GET","path":"/api/v1/transcripts/{transcript_id}","authorization":"bearer_api_key","summary":"Read one preserved transcript."},{"method":"GET","path":"/api/v1/events","authorization":"bearer_api_key","summary":"List structured events with site/transmission/type/callsign filters."},{"method":"GET","path":"/api/v1/events/{event_id}","authorization":"bearer_api_key","summary":"Read one structured event with source provenance."},{"method":"WS","path":"/ws/v1/events","authorization":"bearer_api_key","summary":"Tenant-scoped realtime subscriptions; token is sent in the first message."},{"method":"GET","path":"/api/v1/api-keys","authorization":"bearer_api_key","summary":"List non-secret API-key metadata for the organization."},{"method":"POST","path":"/api/v1/api-keys","authorization":"bearer_api_key","summary":"Issue a server API key; the raw token is returned once."},{"method":"POST","path":"/api/v1/api-keys/{api_key_id}/revoke","authorization":"bearer_api_key","summary":"Revoke an API key in the credential-derived organization."},{"method":"GET","path":"/api/v1/admin/quality","authorization":"bearer_api_key","summary":"Admin-scoped operational quality report."},{"method":"GET","path":"/api/v1/admin/reference","authorization":"bearer_api_key","summary":"Admin-scoped API and error catalog."},{"method":"GET","path":"/admin","authorization":"admin_session","summary":"Browser operator console with controlled create operations."},{"method":"GET","path":"/admin/edge/pair","authorization":"admin_session","summary":"Browser flow for selecting a tenant site for an Edge pairing."},{"method":"POST","path":"/admin/edge/pair","authorization":"admin_session","summary":"Approve an Edge pairing from the browser admin console."}],"supported_scopes":["admin","edge:connect","edge:ingest","read:agents","read:callsigns","read:channels","read:edge","read:events","read:sites","read:teams","read:transcripts","read:transmissions","write:agents","write:callsigns","write:channels","write:edge","write:sites","write:teams"],"common_errors":[{"http_status":400,"code":"invalid_configuration","meaning":"Configuration or a requested resource relationship is invalid."},{"http_status":401,"code":"authentication_required","meaning":"A bearer API key is absent, invalid, expired, or revoked."},{"http_status":403,"code":"insufficient_scope","meaning":"The API key lacks the required scope for this operation."},{"http_status":404,"code":"not_found","meaning":"The requested tenant-owned resource does not exist or is not visible to this tenant."},{"http_status":409,"code":"resource_conflict","meaning":"A resource conflicts with existing state or a configured registration limit has been reached."},{"http_status":422,"code":"validation_error","meaning":"The request shape or value does not meet the API contract."},{"http_status":503,"code":"service_unavailable","meaning":"A required dependency or configured provider is not ready."}]}