{"name":"Caveman Cloud API","description":"Programmatic control plane for Caveman Cloud: AI traffic telemetry, spend attribution, optimization policy, evals, and signed savings evidence.","self":"https://caveman.so/api","api_base":"https://api.caveman.so/api/v1","openapi":"https://caveman.so/openapi.json","agent_index":"https://caveman.so/llms.txt","schemas":"https://caveman.so/schemas/","documentation":"https://caveman.so/developers","contact":"contact@caveman.so","authentication":{"scheme":"Bearer","header":"Authorization: Bearer <access_token>","cookie":"cave_access (browser sessions; mutations also require the x-cave-csrf: ui header)","authorization_server_metadata":"https://caveman.so/.well-known/oauth-authorization-server","grant_types_supported":["urn:ietf:params:oauth:grant-type:device_code"],"scoped":"An access token may be narrowed to a subset of the caller's role permissions. Authorization is the intersection of role and scope, so a scope never grants authority the role lacks. Scope catalogue: components.securitySchemes.oauth2 in the OpenAPI document."},"errors":{"media_type":"application/json","shape":{"error":{"type":"cave_gateway_error","code":"cave_<reason>","message":"string","details":"object (optional)","request_id":"string","trace_id":"string (optional)"}},"guidance":"Match on error.code; it is stable. error.request_id is echoed in the x-cave-request-id response header."},"unauthenticated_endpoints":[{"method":"GET","url":"https://api.caveman.so/health/live","description":"Liveness probe."},{"method":"GET","url":"https://api.caveman.so/health/ready","description":"Readiness probe."},{"method":"GET","url":"https://api.caveman.so/api/v1/system/version","description":"API version, policy schema version, and build revision."},{"method":"GET","url":"https://api.caveman.so/api/v1/providers/catalog","description":"Public model-provider catalogue used for catalog pricing."}]}