{"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/billing/plans","authorization":"public","summary":"Customer-safe TerraSatch subscription plans and entitlements without Stripe price identifiers."},{"method":"POST","path":"/api/v1/billing/checkout","authorization":"public","summary":"Create a rate-limited Stripe-hosted trial Checkout session from a server-owned plan definition."},{"method":"GET","path":"/api/v1/billing/checkout/status","authorization":"public","summary":"Confirm webhook-driven local provisioning state after a Stripe Checkout redirect."},{"method":"GET","path":"/api/v1/billing/subscription","authorization":"bearer_api_key","summary":"Read the authenticated organization's managed subscription state and entitlements."},{"method":"POST","path":"/api/v1/billing/portal","authorization":"bearer_api_key","summary":"Create a short-lived Stripe Customer Portal session for the authenticated organization."},{"method":"POST","path":"/api/v1/billing/activate","authorization":"public","summary":"Consume one single-use owner activation token and set the initial organization-portal password."},{"method":"POST","path":"/api/v1/billing/stripe/webhook","authorization":"stripe_webhook","summary":"Verify and idempotently apply Stripe billing lifecycle events."},{"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 and non-sensitive service entitlement state for the authenticated Edge device."},{"method":"GET","path":"/api/v1/edge/commands","authorization":"bearer_api_key","summary":"Poll commands assigned only to the authenticated Edge device and site."},{"method":"POST","path":"/api/v1/edge/commands/{command_id}/ack","authorization":"bearer_api_key","summary":"Idempotently acknowledge one device-owned command."},{"method":"POST","path":"/api/v1/edge/commands/{command_id}/result","authorization":"bearer_api_key","summary":"Report a simulated or failed result for one acknowledged command."},{"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 subject to managed-plan capacity."},{"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, enable, 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/satchy","authorization":"admin_session","summary":"Inspect Satchy proposals, approvals, and simulated outbound lifecycle."},{"method":"POST","path":"/admin/satchy/actions/{action_id}/approve","authorization":"admin_session","summary":"Approve or edit a proposed Satchy response before queueing."},{"method":"POST","path":"/admin/satchy/actions/{action_id}/reject","authorization":"admin_session","summary":"Reject a proposed Satchy action without outbound execution."},{"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."},{"method":"GET","path":"/admin/data-sources","authorization":"admin_session","summary":"Inspect source connections, queued syncs, provenance counts, and backup state."},{"method":"POST","path":"/admin/data-sources","authorization":"admin_session","summary":"Register a disabled-by-default source adapter and secret reference."},{"method":"POST","path":"/admin/data-sources/{source_id}/sync","authorization":"admin_session","summary":"Queue a bounded source sync without provider I/O in the request path."},{"method":"GET","path":"/admin/data-inspector","authorization":"admin_session","summary":"Search tenant-scoped canonical records and provenance."}],"supported_scopes":["admin","edge:connect","edge:ingest","read:agents","read:billing","read:callsigns","read:channels","read:edge","read:events","read:sites","read:teams","read:transcripts","read:transmissions","write:agents","write:billing","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, subscription state, or a configured registration limit."},{"http_status":422,"code":"validation_error","meaning":"The request shape or value does not meet the API contract."},{"http_status":429,"code":"rate_limited","meaning":"A bounded public endpoint exceeded its request threshold; retry later."},{"http_status":503,"code":"provider_unavailable","meaning":"A required dependency or configured provider is not ready."}]}