{"openapi":"3.1.0","info":{"title":"Squasher API","version":"1.0.0","description":"Canonical contract for every public Squasher API operation. Generated from packages/api-spec."},"servers":[{"url":"https://api.squasher.ai","description":"production"}],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"OAuth2":["mcp"]}],"paths":{"/v1/feedback":{"post":{"operationId":"feedback.submit","summary":"Send feedback about Squasher itself (a bug, an idea, or a docs problem) to the Squasher team. It does not go to your project. The team reads each report; your organization and project IDs are recorded from your credential so the team can follow up. Never include secrets, personal data, or telemetry payloads. Keys with only events:ingest are refused. Limited to 100 reports per organization per hour.","description":"Send feedback about Squasher itself (a bug, an idea, or a docs problem) to the Squasher team. It does not go to your project. The team reads each report; your organization and project IDs are recorded from your credential so the team can follow up. Never include secrets, personal data, or telemetry payloads. Keys with only events:ingest are refused. Limited to 100 reports per organization per hour.","tags":["feedback"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["message"],"properties":{"kind":{"type":"string","enum":["bug","idea","docs","other"],"description":"bug: something is broken; idea: a request; docs: wrong or missing docs. Default other."},"message":{"type":"string","minLength":1,"maxLength":4000,"pattern":"\\S","description":"What happened or what you want, in plain words."},"title":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"Short summary. Defaults to the first line of the message."},"context":{"type":"object","additionalProperties":false,"properties":{"page":{"type":"string","minLength":1,"maxLength":2048,"pattern":"\\S","description":"Dashboard URL, docs URL, or path the feedback is about."},"tool":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"MCP operation, CLI command, or API endpoint it is about."},"client":{"type":"string","minLength":1,"maxLength":128,"pattern":"\\S","description":"Agent or client name, for example claude-code."}}}}}}}},"responses":{"201":{"description":"Feedback received by the Squasher team","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["receipt"],"properties":{"receipt":{"type":"object","additionalProperties":false,"required":["id","feedback_id","status","created_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Receipt ID"},"feedback_id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["accepted"]},"created_at":{"type":"string","format":"date-time"}}}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"write"}},"/.well-known/agent-feedback.json":{"get":{"operationId":"feedback.getProtocolDiscovery","summary":"Discover Squasher's anonymous Feedback.now endpoints, categories, evidence types, and limits.","description":"Discover Squasher's anonymous Feedback.now endpoints, categories, evidence types, and limits.","tags":["feedback"],"security":[],"parameters":[],"responses":{"200":{"description":"Feedback.now discovery document","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["schema_version","name","description","spec_url","policy_url","auth","endpoints","categories","evidence_types","limits","contact"],"properties":{"schema_version":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"spec_url":{"type":"string","format":"uri"},"policy_url":{"type":"string","format":"uri"},"auth":{"type":"object","required":["required","anonymous","type","description"],"properties":{"required":{"type":"boolean"},"anonymous":{"type":"boolean"},"type":{"type":"string","enum":["none"]},"description":{"type":"string"}}},"endpoints":{"type":"object","description":"Named Feedback.now endpoint URLs and operation metadata.","additionalProperties":true},"categories":{"type":"array","items":{"type":"string"}},"evidence_types":{"type":"array","items":{"type":"string"}},"limits":{"type":"object","required":["submissions_per_source_per_hour","max_evidence_per_feedback","max_evidence_content_bytes","max_request_body_bytes"],"properties":{"submissions_per_source_per_hour":{"type":"integer","minimum":1},"max_evidence_per_feedback":{"type":"integer","minimum":1},"max_evidence_content_bytes":{"type":"integer","minimum":1},"max_request_body_bytes":{"type":"integer","minimum":1,"description":"Maximum encoded HTTP request body size for full feedback and evidence attachment submissions."}}},"contact":{"type":"string","format":"uri"}}}}}},"500":{"description":"Unable to process the Feedback.now request","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"default":{"description":"Unexpected Feedback.now error","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/api/v1/policy":{"get":{"operationId":"feedback.getProtocolPolicy","summary":"Read the complete Feedback.now validation, retention, and anonymous submission policy.","description":"Read the complete Feedback.now validation, retention, and anonymous submission policy.","tags":["feedback"],"security":[],"parameters":[],"responses":{"200":{"description":"Feedback.now policy","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["version","authentication","rate_limit_per_hour","categories","severity_levels","reproducibility_options","evidence_types","surface_kinds","retention","limits","endpoints"],"properties":{"version":{"type":"string"},"authentication":{"type":"object","required":["required","anonymous_submissions"],"properties":{"required":{"type":"boolean"},"anonymous_submissions":{"type":"boolean"}}},"rate_limit_per_hour":{"type":"integer","minimum":1},"categories":{"type":"array","items":{"type":"string"}},"severity_levels":{"type":"array","items":{"type":"string"}},"reproducibility_options":{"type":"array","items":{"type":"string"}},"evidence_types":{"type":"array","items":{"type":"string"}},"surface_kinds":{"type":"array","items":{"type":"string"}},"retention":{"type":"object","required":["policy"],"properties":{"policy":{"type":"string"}}},"limits":{"type":"object","additionalProperties":true,"required":["max_request_body_bytes"],"properties":{"max_request_body_bytes":{"type":"integer","minimum":1,"description":"Maximum encoded HTTP request body size for full feedback and evidence attachment submissions."}}},"endpoints":{"type":"object","description":"Named Feedback.now endpoint URLs and operation metadata.","additionalProperties":true}}}}}},"500":{"description":"Unable to process the Feedback.now request","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"default":{"description":"Unexpected Feedback.now error","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/api/v1/observations":{"post":{"operationId":"feedback.submitObservation","summary":"Submit a lightweight anonymous observation about Squasher to the Squasher team; limited to 100 submissions per source per hour.","description":"Submit a lightweight anonymous observation about Squasher to the Squasher team; limited to 100 submissions per source per hour.","tags":["feedback"],"security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["surface","domain","agent_vendor","agent_product"],"properties":{"surface":{"type":"string","minLength":1,"maxLength":2048,"pattern":"\\S"},"domain":{"type":"string","minLength":1,"maxLength":253,"pattern":"\\S"},"agent_vendor":{"type":"string","minLength":1,"maxLength":128,"pattern":"\\S"},"agent_product":{"type":"string","minLength":1,"maxLength":128,"pattern":"\\S"},"category":{"type":"string","enum":["bug","docs_mismatch","friction","feature_gap","quality_degradation","other"]},"severity":{"type":"string","enum":["critical","high","medium","low"]},"confidence":{"type":"number","minimum":0,"maximum":1},"summary":{"type":"string","minLength":1,"maxLength":4096,"pattern":"\\S"}}}}}},"responses":{"201":{"description":"Observation accepted","headers":{"RateLimit":{"description":"RFC 9333-compatible submission quota state","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Submission quota policy","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["receipt"],"properties":{"receipt":{"type":"object","required":["id","observation_id","status","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"observation_id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["accepted","needs_more_evidence","duplicate","rejected","queued"]},"created_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid observation","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"413":{"description":"Request body exceeds the published limit","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"429":{"description":"Anonymous submission rate limit reached","headers":{"RateLimit":{"description":"RFC 9333-compatible submission quota state","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Submission quota policy","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until another anonymous submission may be attempted","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"500":{"description":"Unable to process the Feedback.now request","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"default":{"description":"Unexpected Feedback.now error","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"write"}},"/api/v1/feedback":{"post":{"operationId":"feedback.submitProtocolFeedback","summary":"Submit a full anonymous Feedback.now report about Squasher to the Squasher team, with up to ten bounded evidence items.","description":"Submit a full anonymous Feedback.now report about Squasher to the Squasher team, with up to ten bounded evidence items.","tags":["feedback"],"security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["reporter","subject","signal","content"],"properties":{"reporter":{"type":"object","additionalProperties":false,"required":["agent_vendor","agent_product"],"properties":{"agent_vendor":{"type":"string","minLength":1,"maxLength":128,"pattern":"\\S"},"agent_product":{"type":"string","minLength":1,"maxLength":128,"pattern":"\\S"},"agent_version":{"type":"string","minLength":1,"maxLength":128,"pattern":"\\S"}}},"subject":{"type":"object","additionalProperties":false,"required":["surface","domain"],"properties":{"surface":{"type":"string","minLength":1,"maxLength":2048,"pattern":"\\S"},"domain":{"type":"string","minLength":1,"maxLength":253,"pattern":"\\S"},"kind":{"type":"string","enum":["api_endpoint","docs_page","cli_command","sdk_method","other"]},"product":{"type":"string","minLength":1,"maxLength":128,"pattern":"\\S"}}},"signal":{"type":"object","additionalProperties":false,"required":["category","severity","confidence"],"properties":{"category":{"type":"string","enum":["bug","docs_mismatch","friction","feature_gap","quality_degradation","other"]},"severity":{"type":"string","enum":["critical","high","medium","low"]},"reproducibility":{"type":"string","enum":["always","sometimes","intermittent","once"]},"confidence":{"type":"number","minimum":0,"maximum":1}}},"content":{"type":"object","additionalProperties":false,"required":["title"],"properties":{"title":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S"},"summary":{"type":"string","minLength":1,"maxLength":4096,"pattern":"\\S"},"hypothesis":{"type":"string","minLength":1,"maxLength":2048,"pattern":"\\S"}}},"evidence":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type","content"],"properties":{"type":{"type":"string","enum":["http_summary","stderr_excerpt","repro_steps","screenshot","log_excerpt","other"]},"content":{"type":"string","minLength":1,"description":"UTF-8 content, at most 256 KiB"},"redacted":{"type":"boolean"}}},"maxItems":10}}}}}},"responses":{"201":{"description":"Feedback accepted","headers":{"RateLimit":{"description":"RFC 9333-compatible submission quota state","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Submission quota policy","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["receipt"],"properties":{"receipt":{"type":"object","additionalProperties":false,"required":["id","feedback_id","status","evidence_ids","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"feedback_id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["accepted","needs_more_evidence","duplicate","rejected","queued"]},"evidence_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":10},"created_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid feedback","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"413":{"description":"Request body or evidence item exceeds the published limit","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"429":{"description":"Anonymous submission rate limit reached","headers":{"RateLimit":{"description":"RFC 9333-compatible submission quota state","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Submission quota policy","schema":{"type":"string"}},"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until another anonymous submission may be attempted","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"500":{"description":"Unable to process the Feedback.now request","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"default":{"description":"Unexpected Feedback.now error","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"write"}},"/api/v1/feedback/{id}/attachments":{"post":{"operationId":"feedback.addEvidence","summary":"Attach evidence to your own report (same network source, or the same signed-in account), without exceeding ten items. Other reports return 404.","description":"Attach evidence to your own report (same network source, or the same signed-in account), without exceeding ten items. Other reports return 404.","tags":["feedback"],"security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"Path parameter id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","content"],"properties":{"type":{"type":"string","enum":["http_summary","stderr_excerpt","repro_steps","screenshot","log_excerpt","other"]},"content":{"type":"string","minLength":1,"description":"UTF-8 content, at most 256 KiB"},"redacted":{"type":"boolean"}}},{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type","content"],"properties":{"type":{"type":"string","enum":["http_summary","stderr_excerpt","repro_steps","screenshot","log_excerpt","other"]},"content":{"type":"string","minLength":1,"description":"UTF-8 content, at most 256 KiB"},"redacted":{"type":"boolean"}}},"minItems":1,"maxItems":10},{"type":"object","additionalProperties":false,"required":["evidence"],"properties":{"evidence":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type","content"],"properties":{"type":{"type":"string","enum":["http_summary","stderr_excerpt","repro_steps","screenshot","log_excerpt","other"]},"content":{"type":"string","minLength":1,"description":"UTF-8 content, at most 256 KiB"},"redacted":{"type":"boolean"}}},"minItems":1,"maxItems":10}}}]}}}},"responses":{"201":{"description":"Evidence attached","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"required":["feedback_id","evidence_ids","evidence_count","created_at"],"properties":{"feedback_id":{"type":"string","format":"uuid"},"evidence_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":10},"evidence_count":{"type":"integer","minimum":1,"maximum":10},"created_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid evidence or evidence limit exceeded","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"404":{"description":"Feedback report not found","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"413":{"description":"Request body or evidence item exceeds the published limit","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"500":{"description":"Unable to process the Feedback.now request","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"default":{"description":"Unexpected Feedback.now error","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"write"}},"/api/v1/receipts/{id}":{"get":{"operationId":"feedback.getReceipt","summary":"Read the durable status, duplicate, quality, and evidence state for a submission receipt.","description":"Read the durable status, duplicate, quality, and evidence state for a submission receipt.","tags":["feedback"],"security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"Path parameter id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Receipt state","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"required":["id","feedback_id","observation_id","status","quality_score","evidence_count","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"feedback_id":{"type":["string","null"],"format":"uuid"},"observation_id":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["accepted","needs_more_evidence","duplicate","rejected","queued"]},"quality_score":{"type":["number","null"],"minimum":0,"maximum":1},"evidence_count":{"type":"integer","minimum":0,"maximum":10},"created_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid receipt ID","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"404":{"description":"Receipt not found","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"500":{"description":"Unable to process the Feedback.now request","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}},"default":{"description":"Unexpected Feedback.now error","content":{"application/json":{"schema":{"type":"object","description":"Feedback.now error envelope.","additionalProperties":false,"required":["error","message"],"properties":{"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"errors":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["field","error","message"],"properties":{"field":{"type":"string","minLength":1},"error":{"type":"string","minLength":1},"message":{"type":"string","minLength":1}}}}}}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/investigations":{"get":{"operationId":"investigations.list","summary":"List investigations: the cases Squasher works on, with their status, suspected cause, confidence, and time to diagnosis. view=active lists queued and running cases; view=history lists finished ones.","description":"List investigations: the cases Squasher works on, with their status, suspected cause, confidence, and time to diagnosis. view=active lists queued and running cases; view=history lists finished ones.","tags":["investigations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"view","in":"query","required":false,"description":"Query parameter view","schema":{"enum":["active","history","all"],"type":"string"}},{"name":"status","in":"query","required":false,"description":"Query parameter status","schema":{"enum":["queued","investigating","diagnosed","inconclusive","failed","cancelled"],"type":"string"}},{"name":"trigger","in":"query","required":false,"description":"Query parameter trigger","schema":{"enum":["question","incident","issue","finding","monitor","release","agent_session","schedule"],"type":"string"}},{"name":"incident_id","in":"query","required":false,"description":"Query parameter incident_id","schema":{"format":"uuid","type":"string"}},{"name":"sort","in":"query","required":false,"description":"Query parameter sort","schema":{"enum":["newest","oldest","updated"],"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"maximum":100,"minimum":1,"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Query parameter offset","schema":{"minimum":0,"type":"integer"}}],"responses":{"200":{"description":"A page of investigations","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"investigations":{"items":{"additionalProperties":false,"properties":{"completed_at":{"format":"date-time","type":["string","null"]},"confidence":{"maximum":100,"minimum":0,"type":["integer","null"]},"created_at":{"format":"date-time","type":"string"},"created_by":{"type":["string","null"]},"created_by_type":{"enum":["user","agent","system","automation"],"type":"string"},"diagnosed_at":{"format":"date-time","type":["string","null"]},"id":{"format":"uuid","type":"string"},"incident_id":{"type":["string","null"]},"issue_id":{"type":["string","null"]},"next_steps":{"items":{"type":"string"},"type":"array"},"question":{"type":"string"},"region":{"enum":["us","eu"],"type":"string"},"severity":{"enum":["critical","high","medium","low","unknown",null],"type":["string","null"]},"started_at":{"format":"date-time","type":["string","null"]},"status":{"enum":["queued","investigating","diagnosed","inconclusive","failed","cancelled"],"type":"string"},"subjects":{"items":{"additionalProperties":false,"properties":{"id":{"maxLength":200,"minLength":1,"type":"string"},"kind":{"enum":["incident","issue","finding","monitor","release","service","entity","trace","agent_session"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"}},"required":["kind","id"],"type":"object"},"type":"array"},"summary":{"type":["string","null"]},"suspected_cause":{"type":["string","null"]},"thread_id":{"description":"Chat thread linked to the investigation.","type":["string","null"]},"time_to_diagnosis_seconds":{"description":"Seconds from the start of the investigation to its first diagnosis.","type":["integer","null"]},"trigger":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"kind":{"enum":["question","incident","issue","finding","monitor","release","agent_session","schedule"],"type":"string"}},"required":["id","kind"],"type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["completed_at","confidence","created_at","created_by","created_by_type","diagnosed_at","id","incident_id","issue_id","next_steps","question","region","severity","started_at","status","subjects","summary","suspected_cause","thread_id","time_to_diagnosis_seconds","trigger","updated_at"],"type":"object"},"type":"array"},"limit":{"type":"integer"},"offset":{"type":"integer"},"total":{"type":"integer"}},"required":["investigations","limit","offset","total"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"investigations.create","summary":"Ask Squasher to investigate. Give a question, a subject (incident, issue, monitor, release, service, trace...), or both. An incident subject uses the incident's own investigation. Body: { question?, subject?: { kind, id, label? }, idempotency_key? }","description":"Ask Squasher to investigate. Give a question, a subject (incident, issue, monitor, release, service, trace...), or both. An incident subject uses the incident's own investigation. Body: { question?, subject?: { kind, id, label? }, idempotency_key? }","tags":["investigations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"description":"Give a question, a subject, or both.","properties":{"idempotency_key":{"description":"Retrying with the same key returns the same investigation.","maxLength":200,"minLength":1,"type":"string"},"question":{"maxLength":4000,"minLength":1,"type":"string"},"subject":{"additionalProperties":false,"properties":{"id":{"maxLength":200,"minLength":1,"type":"string"},"kind":{"enum":["incident","issue","finding","monitor","release","service","entity","trace","agent_session"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"}},"required":["kind","id"],"type":"object"}},"type":"object"}}}},"responses":{"200":{"description":"The existing investigation for this key or incident"},"201":{"description":"Investigation started","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"created":{"type":"boolean"},"investigation":{"additionalProperties":false,"properties":{"completed_at":{"format":"date-time","type":["string","null"]},"confidence":{"maximum":100,"minimum":0,"type":["integer","null"]},"created_at":{"format":"date-time","type":"string"},"created_by":{"type":["string","null"]},"created_by_type":{"enum":["user","agent","system","automation"],"type":"string"},"diagnosed_at":{"format":"date-time","type":["string","null"]},"id":{"format":"uuid","type":"string"},"incident_id":{"type":["string","null"]},"issue_id":{"type":["string","null"]},"next_steps":{"items":{"type":"string"},"type":"array"},"question":{"type":"string"},"region":{"enum":["us","eu"],"type":"string"},"severity":{"enum":["critical","high","medium","low","unknown",null],"type":["string","null"]},"started_at":{"format":"date-time","type":["string","null"]},"status":{"enum":["queued","investigating","diagnosed","inconclusive","failed","cancelled"],"type":"string"},"subjects":{"items":{"additionalProperties":false,"properties":{"id":{"maxLength":200,"minLength":1,"type":"string"},"kind":{"enum":["incident","issue","finding","monitor","release","service","entity","trace","agent_session"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"}},"required":["kind","id"],"type":"object"},"type":"array"},"summary":{"type":["string","null"]},"suspected_cause":{"type":["string","null"]},"thread_id":{"description":"Chat thread linked to the investigation.","type":["string","null"]},"time_to_diagnosis_seconds":{"description":"Seconds from the start of the investigation to its first diagnosis.","type":["integer","null"]},"trigger":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"kind":{"enum":["question","incident","issue","finding","monitor","release","agent_session","schedule"],"type":"string"}},"required":["id","kind"],"type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["completed_at","confidence","created_at","created_by","created_by_type","diagnosed_at","id","incident_id","issue_id","next_steps","question","region","severity","started_at","status","subjects","summary","suspected_cause","thread_id","time_to_diagnosis_seconds","trigger","updated_at"],"type":"object"}},"required":["created","investigation"],"type":"object"}}}},"404":{"description":"The subject was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/investigations/{investigation_id}":{"get":{"operationId":"investigations.get","summary":"Get one investigation with its timeline (hypotheses, evidence, actions, notes, redirects, status changes) and its action proposals. after_sequence returns only newer timeline entries. include_actions=false leaves out the action proposals (actions is empty) for light live polling; read them with actions.list.","description":"Get one investigation with its timeline (hypotheses, evidence, actions, notes, redirects, status changes) and its action proposals. after_sequence returns only newer timeline entries. include_actions=false leaves out the action proposals (actions is empty) for light live polling; read them with actions.list.","tags":["investigations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"investigation_id","in":"path","required":true,"description":"Investigation id from investigations.list or investigations.create.","schema":{"format":"uuid","type":"string"}},{"name":"after_sequence","in":"query","required":false,"description":"Query parameter after_sequence","schema":{"minimum":0,"type":"integer"}},{"name":"include_actions","in":"query","required":false,"description":"Query parameter include_actions","schema":{"enum":["true","false"],"type":"string"}}],"responses":{"200":{"description":"Investigation, timeline, and actions","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"actions":{"items":{"additionalProperties":false,"properties":{"action_id":{"type":"string"},"action_label":{"description":"Human name of the action.","type":"string"},"change":{"description":"What the action changes: current value to new value.","items":{"additionalProperties":false,"properties":{"current":{"description":"The value now; null when unknown or new.","type":["string","null"]},"label":{"type":"string"},"proposed":{"description":"The value after the action.","type":"string"},"source":{"description":"`action`: from the action's own rules. `proposer`: what the proposer reported.","enum":["action","proposer"],"type":"string"}},"required":["current","label","proposed","source"],"type":"object"},"type":"array"},"completed_at":{"format":"date-time","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"decided_at":{"format":"date-time","type":["string","null"]},"decided_by":{"type":["string","null"]},"decision_reason":{"type":["string","null"]},"executed_at":{"format":"date-time","type":["string","null"]},"expires_at":{"format":"date-time","type":"string"},"failure_reason":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"idempotency_key":{"type":"string"},"incident_id":{"type":["string","null"]},"investigation_id":{"type":["string","null"]},"param_labels":{"additionalProperties":{"type":"string"},"description":"Human labels of the params.","type":"object"},"params":{"additionalProperties":true,"type":"object"},"postcondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"precondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"proposed_by":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"type":{"enum":["user","agent","system","automation"],"type":"string"}},"required":["id","type"],"type":"object"},"provider":{"type":"string"},"provider_response_id":{"type":["string","null"]},"required_scope":{"type":"string"},"risk_class":{"enum":["low","medium","high"],"type":"string"},"status":{"enum":["proposed","approved","executing","unknown","succeeded","failed","expired","rejected"],"type":"string"},"target":{"additionalProperties":false,"properties":{"id":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"}},"required":["id","kind"],"type":"object"},"title":{"type":"string"}},"required":["action_id","action_label","change","created_at","expires_at","id","param_labels","params","provider","risk_class","status","target","title"],"type":"object"},"type":"array"},"entries":{"items":{"additionalProperties":false,"properties":{"actor":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"type":{"enum":["user","agent","system","automation"],"type":"string"}},"required":["id","type"],"type":"object"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"description":"Entry kind.","type":"string","enum":["hypothesis","evidence","action","note","redirect","status"]},"payload":{"additionalProperties":false,"properties":{"action_status":{"type":["string","null"]},"confidence":{"type":["integer","null"]},"evidence_kind":{"type":["string","null"]},"from":{"type":["string","null"]},"label":{"type":["string","null"]},"proposal_id":{"type":["string","null"]},"reason":{"type":["string","null"]},"ref":{"type":["string","null"]},"text":{"type":["string","null"]},"to":{"type":["string","null"]},"url":{"type":["string","null"]},"verdict":{"type":["string","null"]}},"required":["action_status","confidence","evidence_kind","from","label","proposal_id","reason","ref","text","to","url","verdict"],"type":"object"},"sequence":{"minimum":1,"type":"integer"}},"required":["actor","created_at","id","kind","payload","sequence"],"type":"object"},"type":"array"},"investigation":{"additionalProperties":false,"properties":{"completed_at":{"format":"date-time","type":["string","null"]},"confidence":{"maximum":100,"minimum":0,"type":["integer","null"]},"created_at":{"format":"date-time","type":"string"},"created_by":{"type":["string","null"]},"created_by_type":{"enum":["user","agent","system","automation"],"type":"string"},"diagnosed_at":{"format":"date-time","type":["string","null"]},"id":{"format":"uuid","type":"string"},"incident_id":{"type":["string","null"]},"issue_id":{"type":["string","null"]},"next_steps":{"items":{"type":"string"},"type":"array"},"question":{"type":"string"},"region":{"enum":["us","eu"],"type":"string"},"severity":{"enum":["critical","high","medium","low","unknown",null],"type":["string","null"]},"started_at":{"format":"date-time","type":["string","null"]},"status":{"enum":["queued","investigating","diagnosed","inconclusive","failed","cancelled"],"type":"string"},"subjects":{"items":{"additionalProperties":false,"properties":{"id":{"maxLength":200,"minLength":1,"type":"string"},"kind":{"enum":["incident","issue","finding","monitor","release","service","entity","trace","agent_session"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"}},"required":["kind","id"],"type":"object"},"type":"array"},"summary":{"type":["string","null"]},"suspected_cause":{"type":["string","null"]},"thread_id":{"description":"Chat thread linked to the investigation.","type":["string","null"]},"time_to_diagnosis_seconds":{"description":"Seconds from the start of the investigation to its first diagnosis.","type":["integer","null"]},"trigger":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"kind":{"enum":["question","incident","issue","finding","monitor","release","agent_session","schedule"],"type":"string"}},"required":["id","kind"],"type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["completed_at","confidence","created_at","created_by","created_by_type","diagnosed_at","id","incident_id","issue_id","next_steps","question","region","severity","started_at","status","subjects","summary","suspected_cause","thread_id","time_to_diagnosis_seconds","trigger","updated_at"],"type":"object"}},"required":["actions","entries","investigation"],"type":"object"}}}},"404":{"description":"No investigation with this id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/investigations/{investigation_id}/notes":{"post":{"operationId":"investigations.addNote","summary":"Add a note to the investigation timeline. Body: { text }","description":"Add a note to the investigation timeline. Body: { text }","tags":["investigations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"investigation_id","in":"path","required":true,"description":"Investigation id from investigations.list or investigations.create.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"text":{"maxLength":4000,"minLength":1,"type":"string"}},"required":["text"],"type":"object"}}}},"responses":{"201":{"description":"Note added","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"entry":{"additionalProperties":false,"properties":{"actor":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"type":{"enum":["user","agent","system","automation"],"type":"string"}},"required":["id","type"],"type":"object"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"description":"Entry kind.","type":"string","enum":["hypothesis","evidence","action","note","redirect","status"]},"payload":{"additionalProperties":false,"properties":{"action_status":{"type":["string","null"]},"confidence":{"type":["integer","null"]},"evidence_kind":{"type":["string","null"]},"from":{"type":["string","null"]},"label":{"type":["string","null"]},"proposal_id":{"type":["string","null"]},"reason":{"type":["string","null"]},"ref":{"type":["string","null"]},"text":{"type":["string","null"]},"to":{"type":["string","null"]},"url":{"type":["string","null"]},"verdict":{"type":["string","null"]}},"required":["action_status","confidence","evidence_kind","from","label","proposal_id","reason","ref","text","to","url","verdict"],"type":"object"},"sequence":{"minimum":1,"type":"integer"}},"required":["actor","created_at","id","kind","payload","sequence"],"type":"object"}},"required":["entry"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/investigations/{investigation_id}/redirect":{"post":{"operationId":"investigations.redirect","summary":"Steer the investigation: Squasher records the direction and continues with it, also after a diagnosis. Body: { text }","description":"Steer the investigation: Squasher records the direction and continues with it, also after a diagnosis. Body: { text }","tags":["investigations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"investigation_id","in":"path","required":true,"description":"Investigation id from investigations.list or investigations.create.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"text":{"maxLength":4000,"minLength":1,"type":"string"}},"required":["text"],"type":"object"}}}},"responses":{"202":{"description":"Investigation","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"investigation":{"additionalProperties":false,"properties":{"completed_at":{"format":"date-time","type":["string","null"]},"confidence":{"maximum":100,"minimum":0,"type":["integer","null"]},"created_at":{"format":"date-time","type":"string"},"created_by":{"type":["string","null"]},"created_by_type":{"enum":["user","agent","system","automation"],"type":"string"},"diagnosed_at":{"format":"date-time","type":["string","null"]},"id":{"format":"uuid","type":"string"},"incident_id":{"type":["string","null"]},"issue_id":{"type":["string","null"]},"next_steps":{"items":{"type":"string"},"type":"array"},"question":{"type":"string"},"region":{"enum":["us","eu"],"type":"string"},"severity":{"enum":["critical","high","medium","low","unknown",null],"type":["string","null"]},"started_at":{"format":"date-time","type":["string","null"]},"status":{"enum":["queued","investigating","diagnosed","inconclusive","failed","cancelled"],"type":"string"},"subjects":{"items":{"additionalProperties":false,"properties":{"id":{"maxLength":200,"minLength":1,"type":"string"},"kind":{"enum":["incident","issue","finding","monitor","release","service","entity","trace","agent_session"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"}},"required":["kind","id"],"type":"object"},"type":"array"},"summary":{"type":["string","null"]},"suspected_cause":{"type":["string","null"]},"thread_id":{"description":"Chat thread linked to the investigation.","type":["string","null"]},"time_to_diagnosis_seconds":{"description":"Seconds from the start of the investigation to its first diagnosis.","type":["integer","null"]},"trigger":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"kind":{"enum":["question","incident","issue","finding","monitor","release","agent_session","schedule"],"type":"string"}},"required":["id","kind"],"type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["completed_at","confidence","created_at","created_by","created_by_type","diagnosed_at","id","incident_id","issue_id","next_steps","question","region","severity","started_at","status","subjects","summary","suspected_cause","thread_id","time_to_diagnosis_seconds","trigger","updated_at"],"type":"object"}},"required":["investigation"],"type":"object"}}}},"409":{"description":"The investigation was cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/investigations/{investigation_id}/cancel":{"post":{"operationId":"investigations.cancel","summary":"Stop an active investigation. Body: { reason? }","description":"Stop an active investigation. Body: { reason? }","tags":["investigations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"investigation_id","in":"path","required":true,"description":"Investigation id from investigations.list or investigations.create.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"reason":{"maxLength":2000,"minLength":1,"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"Investigation","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"investigation":{"additionalProperties":false,"properties":{"completed_at":{"format":"date-time","type":["string","null"]},"confidence":{"maximum":100,"minimum":0,"type":["integer","null"]},"created_at":{"format":"date-time","type":"string"},"created_by":{"type":["string","null"]},"created_by_type":{"enum":["user","agent","system","automation"],"type":"string"},"diagnosed_at":{"format":"date-time","type":["string","null"]},"id":{"format":"uuid","type":"string"},"incident_id":{"type":["string","null"]},"issue_id":{"type":["string","null"]},"next_steps":{"items":{"type":"string"},"type":"array"},"question":{"type":"string"},"region":{"enum":["us","eu"],"type":"string"},"severity":{"enum":["critical","high","medium","low","unknown",null],"type":["string","null"]},"started_at":{"format":"date-time","type":["string","null"]},"status":{"enum":["queued","investigating","diagnosed","inconclusive","failed","cancelled"],"type":"string"},"subjects":{"items":{"additionalProperties":false,"properties":{"id":{"maxLength":200,"minLength":1,"type":"string"},"kind":{"enum":["incident","issue","finding","monitor","release","service","entity","trace","agent_session"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"}},"required":["kind","id"],"type":"object"},"type":"array"},"summary":{"type":["string","null"]},"suspected_cause":{"type":["string","null"]},"thread_id":{"description":"Chat thread linked to the investigation.","type":["string","null"]},"time_to_diagnosis_seconds":{"description":"Seconds from the start of the investigation to its first diagnosis.","type":["integer","null"]},"trigger":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"kind":{"enum":["question","incident","issue","finding","monitor","release","agent_session","schedule"],"type":"string"}},"required":["id","kind"],"type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["completed_at","confidence","created_at","created_by","created_by_type","diagnosed_at","id","incident_id","issue_id","next_steps","question","region","severity","started_at","status","subjects","summary","suspected_cause","thread_id","time_to_diagnosis_seconds","trigger","updated_at"],"type":"object"}},"required":["investigation"],"type":"object"}}}},"409":{"description":"The investigation already finished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/actions":{"get":{"operationId":"actions.list","summary":"List action proposals: remediations Squasher proposed (fix pull request, service redeploy or restart, status page update), with exact target, parameters, risk class, expiry, and the precondition and postcondition results.","description":"List action proposals: remediations Squasher proposed (fix pull request, service redeploy or restart, status page update), with exact target, parameters, risk class, expiry, and the precondition and postcondition results.","tags":["actions"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Query parameter status","schema":{"enum":["proposed","approved","executing","unknown","succeeded","failed","expired","rejected"],"type":"string"}},{"name":"investigation_id","in":"query","required":false,"description":"Query parameter investigation_id","schema":{"format":"uuid","type":"string"}},{"name":"incident_id","in":"query","required":false,"description":"Query parameter incident_id","schema":{"format":"uuid","type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"description":"Action proposals","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"actions":{"items":{"additionalProperties":false,"properties":{"action_id":{"type":"string"},"action_label":{"description":"Human name of the action.","type":"string"},"change":{"description":"What the action changes: current value to new value.","items":{"additionalProperties":false,"properties":{"current":{"description":"The value now; null when unknown or new.","type":["string","null"]},"label":{"type":"string"},"proposed":{"description":"The value after the action.","type":"string"},"source":{"description":"`action`: from the action's own rules. `proposer`: what the proposer reported.","enum":["action","proposer"],"type":"string"}},"required":["current","label","proposed","source"],"type":"object"},"type":"array"},"completed_at":{"format":"date-time","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"decided_at":{"format":"date-time","type":["string","null"]},"decided_by":{"type":["string","null"]},"decision_reason":{"type":["string","null"]},"executed_at":{"format":"date-time","type":["string","null"]},"expires_at":{"format":"date-time","type":"string"},"failure_reason":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"idempotency_key":{"type":"string"},"incident_id":{"type":["string","null"]},"investigation_id":{"type":["string","null"]},"param_labels":{"additionalProperties":{"type":"string"},"description":"Human labels of the params.","type":"object"},"params":{"additionalProperties":true,"type":"object"},"postcondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"precondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"proposed_by":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"type":{"enum":["user","agent","system","automation"],"type":"string"}},"required":["id","type"],"type":"object"},"provider":{"type":"string"},"provider_response_id":{"type":["string","null"]},"required_scope":{"type":"string"},"risk_class":{"enum":["low","medium","high"],"type":"string"},"status":{"enum":["proposed","approved","executing","unknown","succeeded","failed","expired","rejected"],"type":"string"},"target":{"additionalProperties":false,"properties":{"id":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"}},"required":["id","kind"],"type":"object"},"title":{"type":"string"}},"required":["action_id","action_label","change","created_at","expires_at","id","param_labels","params","provider","risk_class","status","target","title"],"type":"object"},"type":"array"}},"required":["actions"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/actions/{action_id}/approve":{"post":{"operationId":"actions.approve","summary":"Approve a proposed action and run it at once: Squasher checks the precondition, calls the provider once, and checks the postcondition. Only an owner or admin in a signed-in session can approve; API keys are refused. A result Squasher cannot see becomes unknown and is checked again, never run again. Body: { reason? }","description":"Approve a proposed action and run it at once: Squasher checks the precondition, calls the provider once, and checks the postcondition. Only an owner or admin in a signed-in session can approve; API keys are refused. A result Squasher cannot see becomes unknown and is checked again, never run again. Body: { reason? }","tags":["actions"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"action_id","in":"path","required":true,"description":"Action id from actions.list or investigations.get.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"reason":{"maxLength":2000,"minLength":1,"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"The action after the decision","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"additionalProperties":false,"properties":{"action_id":{"type":"string"},"action_label":{"description":"Human name of the action.","type":"string"},"change":{"description":"What the action changes: current value to new value.","items":{"additionalProperties":false,"properties":{"current":{"description":"The value now; null when unknown or new.","type":["string","null"]},"label":{"type":"string"},"proposed":{"description":"The value after the action.","type":"string"},"source":{"description":"`action`: from the action's own rules. `proposer`: what the proposer reported.","enum":["action","proposer"],"type":"string"}},"required":["current","label","proposed","source"],"type":"object"},"type":"array"},"completed_at":{"format":"date-time","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"decided_at":{"format":"date-time","type":["string","null"]},"decided_by":{"type":["string","null"]},"decision_reason":{"type":["string","null"]},"executed_at":{"format":"date-time","type":["string","null"]},"expires_at":{"format":"date-time","type":"string"},"failure_reason":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"idempotency_key":{"type":"string"},"incident_id":{"type":["string","null"]},"investigation_id":{"type":["string","null"]},"param_labels":{"additionalProperties":{"type":"string"},"description":"Human labels of the params.","type":"object"},"params":{"additionalProperties":true,"type":"object"},"postcondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"precondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"proposed_by":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"type":{"enum":["user","agent","system","automation"],"type":"string"}},"required":["id","type"],"type":"object"},"provider":{"type":"string"},"provider_response_id":{"type":["string","null"]},"required_scope":{"type":"string"},"risk_class":{"enum":["low","medium","high"],"type":"string"},"status":{"enum":["proposed","approved","executing","unknown","succeeded","failed","expired","rejected"],"type":"string"},"target":{"additionalProperties":false,"properties":{"id":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"}},"required":["id","kind"],"type":"object"},"title":{"type":"string"}},"required":["action_id","action_label","change","created_at","expires_at","id","param_labels","params","provider","risk_class","status","target","title"],"type":"object"}},"required":["action"],"type":"object"}}}},"403":{"description":"Only an owner or admin, signed in as a person, can decide. API keys are always refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The action was already decided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"410":{"description":"The proposal expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/actions/{action_id}/reject":{"post":{"operationId":"actions.reject","summary":"Reject a proposed action. Only an owner or admin in a signed-in session can reject; API keys are refused. Body: { reason? }","description":"Reject a proposed action. Only an owner or admin in a signed-in session can reject; API keys are refused. Body: { reason? }","tags":["actions"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"action_id","in":"path","required":true,"description":"Action id from actions.list or investigations.get.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"reason":{"maxLength":2000,"minLength":1,"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"The action after the decision","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"additionalProperties":false,"properties":{"action_id":{"type":"string"},"action_label":{"description":"Human name of the action.","type":"string"},"change":{"description":"What the action changes: current value to new value.","items":{"additionalProperties":false,"properties":{"current":{"description":"The value now; null when unknown or new.","type":["string","null"]},"label":{"type":"string"},"proposed":{"description":"The value after the action.","type":"string"},"source":{"description":"`action`: from the action's own rules. `proposer`: what the proposer reported.","enum":["action","proposer"],"type":"string"}},"required":["current","label","proposed","source"],"type":"object"},"type":"array"},"completed_at":{"format":"date-time","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"decided_at":{"format":"date-time","type":["string","null"]},"decided_by":{"type":["string","null"]},"decision_reason":{"type":["string","null"]},"executed_at":{"format":"date-time","type":["string","null"]},"expires_at":{"format":"date-time","type":"string"},"failure_reason":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"idempotency_key":{"type":"string"},"incident_id":{"type":["string","null"]},"investigation_id":{"type":["string","null"]},"param_labels":{"additionalProperties":{"type":"string"},"description":"Human labels of the params.","type":"object"},"params":{"additionalProperties":true,"type":"object"},"postcondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"precondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"proposed_by":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"type":{"enum":["user","agent","system","automation"],"type":"string"}},"required":["id","type"],"type":"object"},"provider":{"type":"string"},"provider_response_id":{"type":["string","null"]},"required_scope":{"type":"string"},"risk_class":{"enum":["low","medium","high"],"type":"string"},"status":{"enum":["proposed","approved","executing","unknown","succeeded","failed","expired","rejected"],"type":"string"},"target":{"additionalProperties":false,"properties":{"id":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"}},"required":["id","kind"],"type":"object"},"title":{"type":"string"}},"required":["action_id","action_label","change","created_at","expires_at","id","param_labels","params","provider","risk_class","status","target","title"],"type":"object"}},"required":["action"],"type":"object"}}}},"403":{"description":"Only an owner or admin, signed in as a person, can decide. API keys are always refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The action was already decided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"410":{"description":"The proposal expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/actions/{action_id}/resolve":{"post":{"operationId":"actions.resolve","summary":"Settle an action whose result is unknown. Squasher reads the provider first; your outcome is used only when the provider cannot tell. Only an owner or admin in a signed-in session can resolve. Body: { outcome?, note? }","description":"Settle an action whose result is unknown. Squasher reads the provider first; your outcome is used only when the provider cannot tell. Only an owner or admin in a signed-in session can resolve. Body: { outcome?, note? }","tags":["actions"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"action_id","in":"path","required":true,"description":"Action id from actions.list or investigations.get.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"note":{"maxLength":500,"minLength":1,"type":"string"},"outcome":{"description":"Your finding after a check of the provider. Used only when Squasher cannot tell.","enum":["succeeded","failed"],"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"The settled action","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"additionalProperties":false,"properties":{"action_id":{"type":"string"},"action_label":{"description":"Human name of the action.","type":"string"},"change":{"description":"What the action changes: current value to new value.","items":{"additionalProperties":false,"properties":{"current":{"description":"The value now; null when unknown or new.","type":["string","null"]},"label":{"type":"string"},"proposed":{"description":"The value after the action.","type":"string"},"source":{"description":"`action`: from the action's own rules. `proposer`: what the proposer reported.","enum":["action","proposer"],"type":"string"}},"required":["current","label","proposed","source"],"type":"object"},"type":"array"},"completed_at":{"format":"date-time","type":["string","null"]},"created_at":{"format":"date-time","type":"string"},"decided_at":{"format":"date-time","type":["string","null"]},"decided_by":{"type":["string","null"]},"decision_reason":{"type":["string","null"]},"executed_at":{"format":"date-time","type":["string","null"]},"expires_at":{"format":"date-time","type":"string"},"failure_reason":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"idempotency_key":{"type":"string"},"incident_id":{"type":["string","null"]},"investigation_id":{"type":["string","null"]},"param_labels":{"additionalProperties":{"type":"string"},"description":"Human labels of the params.","type":"object"},"params":{"additionalProperties":true,"type":"object"},"postcondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"precondition":{"additionalProperties":false,"properties":{"checkedAt":{"format":"date-time","type":"string"},"detail":{"type":"string"},"ok":{"type":"boolean"}},"required":["checkedAt","detail","ok"],"type":["object","null"]},"proposed_by":{"additionalProperties":false,"properties":{"id":{"type":["string","null"]},"type":{"enum":["user","agent","system","automation"],"type":"string"}},"required":["id","type"],"type":"object"},"provider":{"type":"string"},"provider_response_id":{"type":["string","null"]},"required_scope":{"type":"string"},"risk_class":{"enum":["low","medium","high"],"type":"string"},"status":{"enum":["proposed","approved","executing","unknown","succeeded","failed","expired","rejected"],"type":"string"},"target":{"additionalProperties":false,"properties":{"id":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"}},"required":["id","kind"],"type":"object"},"title":{"type":"string"}},"required":["action_id","action_label","change","created_at","expires_at","id","param_labels","params","provider","risk_class","status","target","title"],"type":"object"}},"required":["action"],"type":"object"}}}},"403":{"description":"Only an owner or admin, signed in as a person, can decide. API keys are always refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The result is not unknown, or Squasher needs your outcome","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects":{"get":{"operationId":"projects.list","summary":"List all service projects in the authenticated organization","description":"List all service projects in the authenticated organization","tags":["projects"],"parameters":[],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}":{"get":{"operationId":"projects.get","summary":"Get a single service project by ID","description":"Get a single service project by ID","tags":["projects"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/setup":{"get":{"operationId":"projects.setup","summary":"Read a project's ingest-key and recent-signal setup status without revealing secrets","description":"Read a project's ingest-key and recent-signal setup status without revealing secrets","tags":["projects"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Project setup and recent signal verification","content":{"application/json":{"schema":{"type":"object","required":["project_id","project_name","platform","data_region","collector_url","ingest_key","signal","next_action"],"properties":{"project_id":{"type":"string","format":"uuid"},"project_name":{"type":"string"},"platform":{"type":["string","null"]},"data_region":{"type":"string","enum":["us","eu"]},"collector_url":{"type":"string","format":"uri"},"ingest_key":{"type":"object","required":["status","key_prefix","last_used_at"],"properties":{"status":{"type":"string","enum":["missing","unused","used"]},"key_prefix":{"type":["string","null"]},"last_used_at":{"type":["string","null"],"format":"date-time"}}},"signal":{"type":"object","required":["status","window_hours","receipt"],"properties":{"status":{"type":"string","enum":["pending","verified","unavailable"]},"window_hours":{"type":"integer","enum":[24]},"receipt":{"type":["object","null"],"required":["id","kind","observed_at"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["error","log"]},"observed_at":{"type":"string","format":"date-time"}}}}},"next_action":{"type":"string","enum":["create_key","connect","send_signal","retry","ready"]}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/spike-protection":{"put":{"operationId":"projects.updateSpikeProtection","summary":"Update the per-project spike protection threshold","description":"Update the per-project spike protection threshold","tags":["projects"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/errors":{"get":{"operationId":"errors.list","summary":"List error groups with status, sorting, pagination, and optional time-window filters","description":"List error groups with status, sorting, pagination, and optional time-window filters","tags":["errors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/errors/counts":{"get":{"operationId":"errors.counts","summary":"Count error groups per status (unresolved, resolved, ignored, muted) for the same filters as errors.list","description":"Count error groups per status (unresolved, resolved, ignored, muted) for the same filters as errors.list","tags":["errors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/errors/{error_group_id}":{"get":{"operationId":"errors.get","summary":"Get a single error group by ID or short ID (iss_42), optionally skipping or time-windowing replay linkage","description":"Get a single error group by ID or short ID (iss_42), optionally skipping or time-windowing replay linkage","tags":["errors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"error_group_id","in":"path","required":true,"description":"Path parameter error_group_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"errors.update","summary":"Update assignment or workflow metadata for an error group","description":"Update assignment or workflow metadata for an error group","tags":["errors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"error_group_id","in":"path","required":true,"description":"Path parameter error_group_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assigned_to":{"type":["string","null"],"description":"User id to assign, or null to clear."},"bookmarked":{"type":"boolean","description":"Whether the current user bookmarked the error group."},"priority":{"type":"string","enum":["low","medium","high","critical"],"description":"Triage priority for the error group."},"status":{"type":"string","enum":["unresolved","resolved","ignored","muted"],"description":"Workflow status for the error group."},"subscribed":{"type":"boolean","description":"Whether the current user is subscribed to the error group."}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/errors/{error_group_id}/merge":{"post":{"operationId":"errors.merge","summary":"Merge duplicate error groups into the canonical error group","description":"Merge duplicate error groups into the canonical error group","tags":["errors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"error_group_id","in":"path","required":true,"description":"Path parameter error_group_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"duplicate_error_group_ids":{"type":"array","items":{"type":"string"}}},"required":["duplicate_error_group_ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/errors/{error_group_id}/unmerge":{"post":{"operationId":"errors.unmerge","summary":"Unmerge a duplicate error group and restore it to normal listings","description":"Unmerge a duplicate error group and restore it to normal listings","tags":["errors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"error_group_id","in":"path","required":true,"description":"Path parameter error_group_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/errors/{error_group_id}/traces":{"get":{"operationId":"errors.listRelatedTraces","summary":"List traces correlated to an error group, optionally scoped by time window","description":"List traces correlated to an error group, optionally scoped by time window","tags":["errors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"error_group_id","in":"path","required":true,"description":"Path parameter error_group_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/errors/{error_group_id}/suspect-commits":{"get":{"operationId":"errors.listSuspectCommits","summary":"List suspect commits correlated to an error group's stack frames, optionally scoped by time window","description":"List suspect commits correlated to an error group's stack frames, optionally scoped by time window","tags":["errors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"error_group_id","in":"path","required":true,"description":"Path parameter error_group_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/events/search":{"get":{"operationId":"events.search","summary":"Full-text search events with Datadog-style query syntax","description":"Full-text search events with Datadog-style query syntax","tags":["events"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Search query","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Inclusive ISO-8601 window start (default: 24 hours before `to`)","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Inclusive ISO-8601 window end (default: now)","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","required":false,"description":"Maximum rows to return (0-200)","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Pagination offset","schema":{"type":"integer"}},{"name":"tags","in":"query","required":false,"description":"Use all (default) for every attribute of each row, or summary for the built-in attribute fields, `squasher.skip_ingest`, and the `tag_paths` attributes only. Summary rows are faster to read.","schema":{"type":"string","enum":["all","summary"]}},{"name":"tag_paths","in":"query","required":false,"description":"With tags=summary: up to 20 comma-separated attribute paths to return in `tags`. A path uses letters, digits, and `_ . : / -`, up to 128 characters. Paths that together need too large a read return 400; request fewer or shorter paths.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/events/latency":{"get":{"operationId":"events.latency","summary":"Get event ingestion latency grouped by source","description":"Get event ingestion latency grouped by source","tags":["events"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/deployments":{"get":{"operationId":"deployments.list","summary":"List provider and generic deployment records","description":"List provider and generic deployment records","tags":["deployments"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"deployments.create","summary":"Create or update an idempotent deployment record","description":"Create or update an idempotent deployment record","tags":["deployments"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["deployment_id"],"properties":{"branch":{"type":"string"},"commit_sha":{"type":"string"},"deployment_id":{"type":"string"},"deployment_url":{"type":"string"},"environment":{"type":"string"},"finished_at":{"type":"string","format":"date-time"},"provider":{"type":"string"},"service":{"type":"string"},"service_name":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["building","canceled","failed","pending","ready","skipped","unknown"]},"url":{"type":"string"},"version":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/logs":{"get":{"operationId":"logs.search","summary":"Search logs for a project with time-window and field filters","description":"Search logs for a project with time-window and field filters","tags":["logs"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Inclusive ISO-8601 window start","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Inclusive ISO-8601 window end","schema":{"type":"string","format":"date-time"}},{"name":"q","in":"query","required":false,"description":"Full-text log search query","schema":{"type":"string"}},{"name":"connector_key","in":"query","required":false,"description":"Connector key filter","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Deployment environment filter","schema":{"type":"string"}},{"name":"level","in":"query","required":false,"description":"Comma-separated severity filters, in any case (`ERROR` matches `error`)","schema":{"type":"string"}},{"name":"release","in":"query","required":false,"description":"Service release filter","schema":{"type":"string"}},{"name":"service","in":"query","required":false,"description":"Service name filter","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Log source filter","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum rows to return","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Pagination offset","schema":{"type":"integer"}},{"name":"tags","in":"query","required":false,"description":"Use all (default) for every attribute of each row, or summary for the built-in attribute fields, `squasher.skip_ingest`, and the `tag_paths` attributes only. Summary rows are faster to read.","schema":{"type":"string","enum":["all","summary"]}},{"name":"tag_paths","in":"query","required":false,"description":"With tags=summary: up to 20 comma-separated attribute paths to return in `tags`. A path uses letters, digits, and `_ . : / -`, up to 128 characters. Paths that together need too large a read return 400; request fewer or shorter paths.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/logs/{event_id}":{"get":{"operationId":"logs.get","summary":"Get one log with every attribute, by the `event_id` and `timestamp` of a search result","description":"Get one log with every attribute, by the `event_id` and `timestamp` of a search result","tags":["logs"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"event_id","in":"path","required":true,"description":"The `event_id` of the log","schema":{"type":"string","format":"uuid"}},{"name":"ts","in":"query","required":true,"description":"The `timestamp` of the log in Unix milliseconds, as search returns it","schema":{"type":"integer"}}],"responses":{"200":{"description":"The log as `data`, with every attribute in `tags`"},"400":{"description":"An `event_id` that is not a UUID, or a missing or invalid `ts`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No log of the project has this `event_id` at this `ts`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/logs/histogram":{"get":{"operationId":"logs.histogram","summary":"Get log event counts bucketed by time and severity","description":"Get log event counts bucketed by time and severity","tags":["logs"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Inclusive ISO-8601 window start","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Inclusive ISO-8601 window end","schema":{"type":"string","format":"date-time"}},{"name":"q","in":"query","required":false,"description":"Full-text log search query","schema":{"type":"string"}},{"name":"connector_key","in":"query","required":false,"description":"Connector key filter","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Deployment environment filter","schema":{"type":"string"}},{"name":"level","in":"query","required":false,"description":"Comma-separated severity filters, in any case (`ERROR` matches `error`)","schema":{"type":"string"}},{"name":"release","in":"query","required":false,"description":"Service release filter","schema":{"type":"string"}},{"name":"service","in":"query","required":false,"description":"Service name filter","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Log source filter","schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"description":"Optional histogram grouping dimension","schema":{"type":"string","enum":["service","http_method","service_version","environment","level","source"]}},{"name":"step","in":"query","required":false,"description":"Optional histogram bucket size","schema":{"type":"string","enum":["1m","5m","15m","1h","6h","1d"]}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/logs/insights":{"get":{"operationId":"logs.insights","summary":"Find recurring log patterns and compare field distributions with the previous period; the resolved window must be ordered and no longer than 30 days","description":"Find recurring log patterns and compare field distributions with the previous period; the resolved window must be ordered and no longer than 30 days","tags":["logs"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Inclusive window start; must not be after `to`","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Inclusive window end; the resolved `from`/`to` range cannot exceed 30 days","schema":{"type":"string","format":"date-time"}},{"name":"q","in":"query","required":false,"description":"Full-text log search query","schema":{"type":"string"}},{"name":"connector_key","in":"query","required":false,"description":"Connector key filter","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Deployment environment filter","schema":{"type":"string"}},{"name":"level","in":"query","required":false,"description":"Comma-separated severity filters, in any case (`ERROR` matches `error`)","schema":{"type":"string"}},{"name":"release","in":"query","required":false,"description":"Service release filter","schema":{"type":"string"}},{"name":"service","in":"query","required":false,"description":"Service name filter","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Log source filter","schema":{"type":"string"}},{"name":"dimensions","in":"query","required":false,"description":"Up to five comma-separated public log attribute paths sampled independently in each window for current-versus-previous distributions","schema":{"type":"string"}},{"name":"view","in":"query","required":false,"description":"Use patterns for bounded pattern analysis, changes for window comparisons, or facets for current filter distributions. Full returns all analyses. Unrequested arrays are empty and uncomputed totals are zero.","schema":{"type":"string","enum":["facets","patterns","changes","full"]}}],"responses":{"200":{"description":"Log patterns and current-versus-previous distributions"},"400":{"description":"Invalid timestamp, `from` after `to`, or a resolved insight window longer than 30 days","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"read"}},"/v1/projects/{project_id}/metrics":{"get":{"operationId":"metrics.list","summary":"List metric series for a project with filtering and pagination","description":"List metric series for a project with filtering and pagination","tags":["metrics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/metrics/timeline":{"get":{"operationId":"metrics.timeline","summary":"Get time-series metric data for a named metric and metric type with avg, count, sum, and percentile aggregations","description":"Get time-series metric data for a named metric and metric type with avg, count, sum, and percentile aggregations","tags":["metrics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/metrics/inspect":{"get":{"operationId":"metrics.inspect","summary":"Get AI/operator-friendly snapshots and highlights for one metric series","description":"Get AI/operator-friendly snapshots and highlights for one metric series","tags":["metrics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/monitors":{"get":{"operationId":"monitors.list","summary":"List monitors for a project with agent-friendly filters","description":"List monitors for a project with agent-friendly filters","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"monitors.create","summary":"Create a monitor for a project. Body: { name, kind, target, config, enabled?, linkedComponent?, runbookUrl? }","description":"Create a monitor for a project. Body: { name, kind, target, config, enabled?, linkedComponent?, runbookUrl? }","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"config":{"additionalProperties":true,"description":"Monitor-kind-specific configuration. Set the check frequency with `intervalSeconds` (or the whole-minute `intervalMinutes`); `intervalSeconds` wins when both are set. Each plan has a minimum interval.","properties":{"intervalMinutes":{"description":"Check interval in whole minutes (1-1440). Legacy form of intervalSeconds.","maximum":1440,"minimum":1,"type":"integer"},"intervalSeconds":{"description":"Check interval in seconds. 30-second checks need a paid plan and an HTTP, keyword, TCP, DNS, SSL, domain, or mail monitor.","enum":[30,60,120,180,300,600,900,1800,3600],"type":"integer"},"regions":{"description":"HTTP and keyword monitors: check locations (us-west, us-east, eu-west, eu-east, asia-pacific, oceania). Every location runs on each interval and counts as one check. Each plan caps the number of locations. Older codes such as iad or lhr name the matching location; auto keeps one check from the default location.","items":{"type":"string"},"maxItems":6,"minItems":1,"type":"array"},"confirmation":{"additionalProperties":false,"description":"HTTP and keyword monitors with locations: how many locations must fail in the same interval before the monitor fails. Default 2 (1 with one location).","properties":{"requiredLocations":{"minimum":1,"maximum":6,"type":"integer"}},"required":["requiredLocations"],"type":"object"}},"type":"object"},"enabled":{"type":"boolean"},"kind":{"description":"Monitor kind such as http, ssl, tcp, or heartbeat.","type":"string"},"linkedComponent":{"type":["string","null"]},"name":{"type":"string"},"runbookUrl":{"type":["string","null"]},"target":{"description":"URL, host, token, or monitor-specific target.","type":"string"}},"required":["config","kind","name","target"],"type":"object"}}}},"responses":{"201":{"description":"Created monitor","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Monitor summary with latest health state.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/monitor-templates":{"get":{"operationId":"monitors.listTemplates","summary":"List monitor templates for one-click creation","description":"List monitor templates for one-click creation","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Monitor template catalog","content":{"application/json":{"schema":{"items":{"additionalProperties":false,"properties":{"configTemplate":{"additionalProperties":true,"description":"Monitor config with template placeholders for input values.","type":"object"},"description":{"type":"string"},"id":{"type":"string"},"inputs":{"items":{"additionalProperties":false,"properties":{"default":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"key":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"},"type":{"enum":["string","number","boolean"],"type":"string"}},"required":["key","label","type","required"],"type":"object"},"type":"array"},"kind":{"type":"string"},"name":{"type":"string"}},"required":["id","name","description","kind","inputs","configTemplate"],"type":"object"},"type":"array"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/monitor-templates/{template_id}":{"post":{"operationId":"monitors.createFromTemplate","summary":"Create a monitor from a catalog template. Body is template input values.","description":"Create a monitor from a catalog template. Body is template input values.","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"template_id","in":"path","required":true,"description":"Path parameter template_id","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"description":"Template input values keyed by template input key.","type":"object"}}}},"responses":{"201":{"description":"Created monitor","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Monitor summary with latest health state.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/monitors/upsert":{"post":{"operationId":"monitors.upsertByName","summary":"Create or update a monitor by name. Body matches monitors.create.","description":"Create or update a monitor by name. Body matches monitors.create.","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"config":{"additionalProperties":true,"description":"Monitor-kind-specific configuration. Set the check frequency with `intervalSeconds` (or the whole-minute `intervalMinutes`); `intervalSeconds` wins when both are set. Each plan has a minimum interval.","properties":{"intervalMinutes":{"description":"Check interval in whole minutes (1-1440). Legacy form of intervalSeconds.","maximum":1440,"minimum":1,"type":"integer"},"intervalSeconds":{"description":"Check interval in seconds. 30-second checks need a paid plan and an HTTP, keyword, TCP, DNS, SSL, domain, or mail monitor.","enum":[30,60,120,180,300,600,900,1800,3600],"type":"integer"},"regions":{"description":"HTTP and keyword monitors: check locations (us-west, us-east, eu-west, eu-east, asia-pacific, oceania). Every location runs on each interval and counts as one check. Each plan caps the number of locations. Older codes such as iad or lhr name the matching location; auto keeps one check from the default location.","items":{"type":"string"},"maxItems":6,"minItems":1,"type":"array"},"confirmation":{"additionalProperties":false,"description":"HTTP and keyword monitors with locations: how many locations must fail in the same interval before the monitor fails. Default 2 (1 with one location).","properties":{"requiredLocations":{"minimum":1,"maximum":6,"type":"integer"}},"required":["requiredLocations"],"type":"object"}},"type":"object"},"enabled":{"type":"boolean"},"kind":{"description":"Monitor kind such as http, ssl, tcp, or heartbeat.","type":"string"},"linkedComponent":{"type":["string","null"]},"name":{"type":"string"},"runbookUrl":{"type":["string","null"]},"target":{"description":"URL, host, token, or monitor-specific target.","type":"string"}},"required":["config","kind","name","target"],"type":"object"}}}},"responses":{"200":{"description":"Updated monitor","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Monitor summary with latest health state.","type":"object"}}}},"201":{"description":"Created monitor","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Monitor summary with latest health state.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/monitors/evaluations":{"get":{"operationId":"monitors.listEvaluations","summary":"List the latest noise evaluation per monitor: how many incidents it opened, how many reached a human, how many were acted on, and a recommendation (no_change, widen_threshold, demote_attention, redefine, disable_candidate) with the reasoning. Read-only — recommendations are never applied automatically. Query: monitor_id?, actionable_only?, limit?","description":"List the latest noise evaluation per monitor: how many incidents it opened, how many reached a human, how many were acted on, and a recommendation (no_change, widen_threshold, demote_attention, redefine, disable_candidate) with the reasoning. Read-only — recommendations are never applied automatically. Query: monitor_id?, actionable_only?, limit?","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Latest monitor noise evaluations","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"items":{"additionalProperties":false,"properties":{"acted_on_count":{"description":"Delivered incidents a human acknowledged, took, or commented on.","type":"integer"},"confidence":{"description":"How well the sample supports the recommendation. Never act on `low`.","enum":["low","medium","high"],"type":"string"},"delivered_count":{"description":"Incidents whose opening alert produced at least one successful notification delivery. Recommendations are scoped to these, so a broken notification route is never misread as an unwanted monitor.","type":"integer"},"evaluated_at":{"format":"date-time","type":"string"},"incident_count":{"type":"integer"},"median_resolve_minutes":{"type":["integer","null"]},"monitor_id":{"type":"string"},"rationale":{"description":"Plain-language justification.","type":"string"},"recommendation":{"enum":["no_change","widen_threshold","demote_attention","redefine","disable_candidate"],"type":"string"},"self_healed_count":{"type":"integer"},"window_days":{"type":"integer"}},"required":["acted_on_count","confidence","delivered_count","evaluated_at","incident_count","median_resolve_minutes","monitor_id","rationale","recommendation","self_healed_count","window_days"],"type":"object"},"type":"array"},"total":{"type":"integer"}},"required":["data","total"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/monitors/backtest":{"post":{"operationId":"monitors.backtest","summary":"Replay a draft query monitor over the last 24 hours or 7 days of real data with the same evaluation live monitors use. Returns each simulated check, the alerts the rule would have opened, and a summary. Saves nothing. Needs `monitors:read` and `errors:read`. Uses the project's query budget; a 503 means retry later. Each read has a byte and time limit; past it the outcome is `budget_exceeded`.","description":"Replay a draft query monitor over the last 24 hours or 7 days of real data with the same evaluation live monitors use. Returns each simulated check, the alerts the rule would have opened, and a summary. Saves nothing. Needs `monitors:read` and `errors:read`. Uses the project's query budget; a 503 means retry later. Each read has a byte and time limit; past it the outcome is `budget_exceeded`.","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"config":{"additionalProperties":true,"description":"A draft query monitor config, the same shape as `config` for a `query` monitor in monitors.create: source (events, logs, latency for ingest delay, metrics, traces for request latency, vitals), aggregation (p50, p95, or p99 for traces), comparator (gt, gte, lt, lte, eq, spike), threshold or spikeMultiplier/baselineDays/minCount, window, query, environment, metric, metricType, serviceName, operation (traces only: span name or HTTP route), noDataPolicy, breachStatus. failureThreshold, recoveryThreshold, and intervalMinutes default to 3, 2, and 5.","properties":{"aggregation":{"type":"string"},"comparator":{"enum":["gt","gte","lt","lte","eq","spike"],"type":"string"},"source":{"enum":["events","logs","latency","metrics","traces","vitals"],"type":"string"},"window":{"type":"string"}},"required":["aggregation","comparator","source","window"],"type":"object"},"range":{"default":"24h","description":"How much history to replay. At most 7 days.","enum":["24h","7d"],"type":"string"}},"required":["config"],"type":"object"}}}},"responses":{"200":{"description":"Backtest result","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"authoritative":{"description":"False when the window values are estimates (a percentile combined from several buckets). The points are returned, but `incidents` is empty and the alert counts are null.","type":"boolean"},"from":{"format":"date-time","type":"string"},"incidents":{"description":"Alerts the rule would have opened. `ended_at` is null while still open.","items":{"additionalProperties":false,"properties":{"ended_at":{"format":"date-time","type":["string","null"]},"peak_value":{"type":["number","null"]},"started_at":{"format":"date-time","type":"string"}},"required":["ended_at","peak_value","started_at"],"type":"object"},"type":"array"},"points":{"description":"One point per simulated check: the window value, the line it compared against (the threshold, or the spike line), the check status, and the monitor status after the failure and recovery thresholds.","items":{"additionalProperties":false,"properties":{"at":{"format":"date-time","type":"string"},"monitor_status":{"enum":["healthy","degraded","failed","paused"],"type":"string"},"outcome":{"enum":["signal","no_data","error","not_evaluated"],"type":"string"},"reason":{"anyOf":[{"enum":["after_watermark","baseline_unavailable","incomplete_bucket","insufficient_history"],"type":"string"},{"type":"null"}]},"status":{"enum":["healthy","degraded","failed"],"type":"string"},"threshold":{"type":["number","null"]},"value":{"type":["number","null"]}},"required":["at","monitor_status","outcome","reason","status","threshold","value"],"type":"object"},"type":"array"},"outcome":{"description":"`ok`; `unsupported` when the draft cannot be backtested; `budget_exceeded` when a read passed the per-backtest byte or time limit.","enum":["ok","unsupported","budget_exceeded"],"type":"string"},"range":{"enum":["24h","7d"],"type":"string"},"reason":{"description":"Why the draft cannot be backtested, when `supported` is false.","type":["string","null"]},"resolution":{"additionalProperties":false,"description":"The bucket width the replay read. When it cannot follow the rule exactly, `approximate` is true and `notes` say what changed.","properties":{"approximate":{"type":"boolean"},"bucket_seconds":{"type":"integer"},"interval_seconds":{"type":"integer"},"notes":{"items":{"type":"string"},"type":"array"},"window_seconds":{"type":"integer"}},"required":["approximate","bucket_seconds","interval_seconds","notes","window_seconds"],"type":"object"},"rule_version":{"type":"integer"},"summary":{"additionalProperties":false,"properties":{"alert_count":{"type":["integer","null"]},"breaching_checks":{"type":["integer","null"]},"checks":{"type":"integer"},"evaluated_checks":{"type":"integer"},"first_alert_at":{"format":"date-time","type":["string","null"]},"not_evaluated":{"additionalProperties":{"type":"integer"},"description":"Checks the data could not support, counted by reason.","type":"object"},"open_at_end":{"type":["boolean","null"]}},"required":["alert_count","breaching_checks","checks","evaluated_checks","first_alert_at","not_evaluated","open_at_end"],"type":"object"},"supported":{"type":"boolean"},"to":{"format":"date-time","type":"string"},"watermark":{"description":"Data newer than this may still arrive; later checks are not evaluated.","format":"date-time","type":"string"}},"required":["authoritative","from","incidents","outcome","points","range","reason","resolution","rule_version","summary","supported","to","watermark"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/monitors/tuning":{"get":{"operationId":"monitors.getTuningSettings","summary":"Get monitor auto-tuning mode, hard-bounded AI budget settings, adjustment audit history, hourly observation time, and measured outcomes.","description":"Get monitor auto-tuning mode, hard-bounded AI budget settings, adjustment audit history, hourly observation time, and measured outcomes.","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"monitors.updateTuningSettings","summary":"Update project monitor tuning. Defaults to recommend; auto mode only applies bounded, expiring threshold overrides. Hard caps: $5/day, $0.50/run, and 20 runs/day.","description":"Update project monitor tuning. Defaults to recommend; auto mode only applies bounded, expiring threshold overrides. Hard caps: $5/day, $0.50/run, and 20 runs/day.","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"adjustment_cooldown_days":{"type":"integer"},"daily_budget_cents":{"type":"integer"},"max_daily_investigations":{"type":"integer"},"mode":{"enum":["off","recommend","auto"],"type":"string"},"override_ttl_days":{"type":"integer"},"per_run_budget_cents":{"type":"integer"}},"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/monitors/{monitor_id}/tuning":{"get":{"operationId":"monitors.getTuning","summary":"Get declared versus effective monitor config, tuning mode, human lock, and audit history.","description":"Get declared versus effective monitor config, tuning mode, human lock, and audit history.","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"monitor_id","in":"path","required":true,"description":"Path parameter monitor_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"monitors.updateTuning","summary":"Override the project tuning mode for one monitor.","description":"Override the project tuning mode for one monitor.","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"monitor_id","in":"path","required":true,"description":"Path parameter monitor_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"mode":{"anyOf":[{"enum":["off","recommend","auto"],"type":"string"},{"type":"null"}]}},"required":["mode"],"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/monitors/{monitor_id}/tuning/actions":{"post":{"operationId":"monitors.tuningAction","summary":"Investigate a candidate or apply, reject, or revert a proposed expiring override.","description":"Investigate a candidate or apply, reject, or revert a proposed expiring override.","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"monitor_id","in":"path","required":true,"description":"Path parameter monitor_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"enum":["apply","investigate","reject","revert"],"type":"string"},"adjustment_id":{"format":"uuid","type":"string"},"reason":{"type":"string"}},"required":["action"],"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/monitors/{monitor_id}":{"get":{"operationId":"monitors.get","summary":"Get one monitor with its latest state and linked incident","description":"Get one monitor with its latest state and linked incident","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"monitor_id","in":"path","required":true,"description":"Path parameter monitor_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"monitors.update","summary":"Update a monitor. Body: { name?, target?, config?, enabled?, linkedComponent?, runbookUrl? }","description":"Update a monitor. Body: { name?, target?, config?, enabled?, linkedComponent?, runbookUrl? }","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"monitor_id","in":"path","required":true,"description":"Path parameter monitor_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"config":{"additionalProperties":true,"description":"Monitor-kind-specific configuration. Set the check frequency with `intervalSeconds` (or the whole-minute `intervalMinutes`); `intervalSeconds` wins when both are set. Each plan has a minimum interval.","properties":{"intervalMinutes":{"description":"Check interval in whole minutes (1-1440). Legacy form of intervalSeconds.","maximum":1440,"minimum":1,"type":"integer"},"intervalSeconds":{"description":"Check interval in seconds. 30-second checks need a paid plan and an HTTP, keyword, TCP, DNS, SSL, domain, or mail monitor.","enum":[30,60,120,180,300,600,900,1800,3600],"type":"integer"},"regions":{"description":"HTTP and keyword monitors: check locations (us-west, us-east, eu-west, eu-east, asia-pacific, oceania). Every location runs on each interval and counts as one check. Each plan caps the number of locations. Older codes such as iad or lhr name the matching location; auto keeps one check from the default location.","items":{"type":"string"},"maxItems":6,"minItems":1,"type":"array"},"confirmation":{"additionalProperties":false,"description":"HTTP and keyword monitors with locations: how many locations must fail in the same interval before the monitor fails. Default 2 (1 with one location).","properties":{"requiredLocations":{"minimum":1,"maximum":6,"type":"integer"}},"required":["requiredLocations"],"type":"object"}},"type":"object"},"enabled":{"type":"boolean"},"kind":{"description":"Monitor kind such as http, ssl, tcp, or heartbeat.","type":"string"},"linkedComponent":{"type":["string","null"]},"name":{"type":"string"},"runbookUrl":{"type":["string","null"]},"target":{"description":"URL, host, token, or monitor-specific target.","type":"string"}},"required":[],"type":"object"}}}},"responses":{"200":{"description":"Updated monitor","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Monitor summary with latest health state.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"monitors.delete","summary":"Delete a monitor","description":"Delete a monitor","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"monitor_id","in":"path","required":true,"description":"Path parameter monitor_id","schema":{"type":"string"}}],"responses":{"204":{"description":"Monitor deleted"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/monitors/{monitor_id}/checks":{"get":{"operationId":"monitors.listChecks","summary":"List recent stored checks of a monitor, newest first, with the check location and the failure evidence of failed checks. Query: limit? (1-100, default 20), failing_only?, region?","description":"List recent stored checks of a monitor, newest first, with the check location and the failure evidence of failed checks. Query: limit? (1-100, default 20), failing_only?, region?","tags":["monitors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"monitor_id","in":"path","required":true,"description":"Path parameter monitor_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Recent monitor checks","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"items":{"additionalProperties":false,"properties":{"checkColo":{"description":"Cloudflare data center (IATA code) that ran a location check.","type":["string","null"]},"checkedAt":{"format":"date-time","type":"string"},"confirmationOutcome":{"type":["string","null"]},"errorMessage":{"type":["string","null"]},"evidence":{"additionalProperties":false,"description":"Failure evidence of a failed HTTP or keyword check. Headers and the body excerpt (first 2 KB of a text body) are redacted; credentials and cookies are never stored.","properties":{"dns":{"additionalProperties":true,"properties":{"answers":{"items":{"type":"string"},"type":"array"}},"type":"object"},"http":{"additionalProperties":true,"type":"object"},"networkSkipped":{"description":"Why DNS, TCP, and TLS facts are missing (time budget, or per-run limit).","enum":["budget","limit"],"type":"string"},"tcp":{"additionalProperties":true,"properties":{"durationMs":{"type":["integer","null"]},"error":{"type":"string"}},"type":"object"},"tls":{"additionalProperties":true,"properties":{"durationMs":{"type":["integer","null"]},"error":{"type":"string"}},"type":"object"}},"type":["object","null"]},"failedLocations":{"items":{"type":"string"},"type":["array","null"]},"id":{"type":"string"},"latencyMs":{"type":["integer","null"]},"region":{"description":"Check location id, or a legacy region label.","type":"string"},"regionLabel":{"type":"string"},"requiredLocations":{"type":["integer","null"]},"responseSummary":{"type":["string","null"]},"status":{"enum":["healthy","degraded","failed","paused"],"type":"string"},"statusCode":{"type":["integer","null"]}},"required":["id","checkedAt","region","regionLabel","status"],"type":"object"},"type":"array"}},"required":["data"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/findings":{"get":{"operationId":"findings.list","summary":"List findings: services whose latency, error rate, traffic, or error logs left their expected band, checked hourly against each service's own history. Newest first, cursor paginated. Needs `findings:read`.","description":"List findings: services whose latency, error rate, traffic, or error logs left their expected band, checked hourly against each service's own history. Newest first, cursor paginated. Needs `findings:read`.","tags":["findings"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Defaults to `open`.","schema":{"default":"open","enum":["open","resolved","all"],"type":"string"}},{"name":"kind","in":"query","required":false,"description":"Only findings of this source kind.","schema":{"enum":["anomaly","rule","release_regression","slo_burn","agent_session","funnel"],"description":"Where the finding came from. Only `anomaly` is produced today.","type":"string"}},{"name":"signal","in":"query","required":false,"description":"Query parameter signal","schema":{"enum":["latency_p95","error_rate","traffic_drop","error_logs","traffic"],"type":"string"}},{"name":"service","in":"query","required":false,"description":"Query parameter service","schema":{"maxLength":256,"minLength":1,"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"maxLength":256,"minLength":1,"type":"string"}},{"name":"severity","in":"query","required":false,"description":"Query parameter severity","schema":{"enum":["warning","critical"],"type":"string"}},{"name":"from","in":"query","required":false,"description":"Only findings that were active at or after this time.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"Only findings that were active at or before this time.","schema":{"format":"date-time","type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size from 1 to 100. Defaults to 50.","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"Opaque next_cursor value returned by the previous page.","schema":{"maxLength":512,"minLength":1,"type":"string"}}],"responses":{"200":{"description":"A page of findings","content":{"application/json":{"schema":{"additionalProperties":false,"description":"Findings ordered by `last_seen_at`, newest first.","properties":{"data":{"items":{"additionalProperties":false,"description":"One detected deviation of one measured series (signal x service x environment), from the first hourly evaluation outside the expected band until the series is back inside the band.","properties":{"data_watermark":{"format":"date-time","type":"string","description":"Data newer than this was not complete when the finding was last evaluated."},"detector":{"additionalProperties":false,"properties":{"id":{"enum":["hourly_baseline","seasonal_hour_of_week"],"type":"string"},"version":{"type":"integer"}},"required":["id","version"],"type":"object"},"direction":{"description":"Which side of the expected band the observed value is on.","enum":["above","below"],"type":"string"},"environment":{"type":["string","null"]},"evaluation_count":{"description":"Hourly evaluations in this finding.","type":"integer"},"expected":{"additionalProperties":false,"properties":{"baseline":{"type":["number","null"]},"high":{"type":["number","null"]},"low":{"type":["number","null"]}},"required":["baseline","high","low"],"type":"object"},"first_seen_at":{"format":"date-time","type":"string","description":"Start of the first hour outside the band."},"id":{"format":"uuid","type":"string"},"incident":{"additionalProperties":false,"description":"The incident this finding opened. A finding links to at most one incident.","properties":{"id":{"description":"Display ID, for example `INC-12`.","type":"string"},"status":{"enum":["investigating","identified","monitoring","resolved"],"type":"string"},"title":{"type":"string"}},"required":["id","status","title"],"type":["object","null"]},"investigation_id":{"type":["string","null"]},"last_seen_at":{"format":"date-time","type":"string","description":"Start of the latest hour outside the band."},"muted_until":{"format":"date-time","type":["string","null"],"description":"While in the future, this finding does not open an incident."},"observed":{"type":["number","null"],"description":"The latest breaching evaluation's value."},"operation":{"type":["string","null"]},"project_id":{"format":"uuid","type":"string"},"resolved_at":{"format":"date-time","type":["string","null"]},"resolved_reason":{"description":"`corrected` means late data showed the series never left the band.","enum":["returned_to_band","corrected",null],"type":["string","null"]},"score":{"description":"Larger means further from normal. For ranking only.","type":"number"},"service":{"type":["string","null"]},"severity":{"enum":["warning","critical"],"type":"string"},"signal":{"enum":["latency_p95","error_rate","traffic_drop","error_logs","traffic"],"type":"string"},"source_kind":{"enum":["anomaly","rule","release_regression","slo_burn","agent_session","funnel"],"description":"Where the finding came from. Only `anomaly` is produced today.","type":"string"},"status":{"enum":["open","resolved"],"type":"string"},"summary":{"type":"string"},"title":{"type":"string"},"unit":{"enum":["ms","ratio","count"],"description":"`ratio` is a 0..1 fraction, for example an error rate.","type":"string"},"window_seconds":{"type":"integer"}},"required":["data_watermark","detector","direction","environment","evaluation_count","expected","first_seen_at","id","incident","investigation_id","last_seen_at","muted_until","observed","operation","project_id","resolved_at","resolved_reason","score","service","severity","signal","source_kind","status","summary","title","unit","window_seconds"],"type":"object"},"type":"array"},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to read the next page."}},"required":["data","next_cursor"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/findings/{finding_id}":{"get":{"operationId":"findings.get","summary":"Get one finding with its hourly evaluations, the hourly series and expected band around it, and nearby deployments and error groups. Needs `findings:read`.","description":"Get one finding with its hourly evaluations, the hourly series and expected band around it, and nearby deployments and error groups. Needs `findings:read`.","tags":["findings"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"finding_id","in":"path","required":true,"description":"Path parameter finding_id","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"The finding and its evidence","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"evaluations":{"description":"Hourly evaluations, oldest first.","items":{"additionalProperties":false,"description":"One hourly evaluation. A late-data re-check of the same hour has a higher revision.","properties":{"baseline":{"type":["number","null"]},"breached":{"type":"boolean"},"bucket_end":{"format":"date-time","type":"string"},"bucket_start":{"format":"date-time","type":"string"},"evaluated_at":{"format":"date-time","type":"string"},"expected_high":{"type":["number","null"]},"expected_low":{"type":["number","null"]},"observed":{"type":["number","null"]},"revision":{"type":"integer"}},"required":["baseline","breached","bucket_end","bucket_start","evaluated_at","expected_high","expected_low","observed","revision"],"type":"object"},"type":"array"},"evidence":{"additionalProperties":false,"properties":{"deployments":{"description":"Deployments from 6 hours before the first breach to 1 hour after the last. At most 10.","items":{"additionalProperties":false,"properties":{"commit_sha":{"type":["string","null"]},"deployed_at":{"format":"date-time","type":"string"},"environment":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"service":{"type":["string","null"]},"version":{"type":["string","null"]}},"required":["commit_sha","deployed_at","environment","id","service","version"],"type":"object"},"maxItems":10,"type":"array"},"error_groups":{"description":"Top error groups for the service in the finding's window. At most 5.","items":{"additionalProperties":false,"properties":{"count":{"type":"number"},"id":{"type":"string"},"last_seen_at":{"format":"date-time","type":"string"},"title":{"type":"string"}},"required":["count","id","last_seen_at","title"],"type":"object"},"maxItems":5,"type":"array"}},"required":["deployments","error_groups"],"type":"object"},"finding":{"additionalProperties":false,"description":"One detected deviation of one measured series (signal x service x environment), from the first hourly evaluation outside the expected band until the series is back inside the band.","properties":{"data_watermark":{"format":"date-time","type":"string","description":"Data newer than this was not complete when the finding was last evaluated."},"detector":{"additionalProperties":false,"properties":{"id":{"enum":["hourly_baseline","seasonal_hour_of_week"],"type":"string"},"version":{"type":"integer"}},"required":["id","version"],"type":"object"},"direction":{"description":"Which side of the expected band the observed value is on.","enum":["above","below"],"type":"string"},"environment":{"type":["string","null"]},"evaluation_count":{"description":"Hourly evaluations in this finding.","type":"integer"},"expected":{"additionalProperties":false,"properties":{"baseline":{"type":["number","null"]},"high":{"type":["number","null"]},"low":{"type":["number","null"]}},"required":["baseline","high","low"],"type":"object"},"first_seen_at":{"format":"date-time","type":"string","description":"Start of the first hour outside the band."},"id":{"format":"uuid","type":"string"},"incident":{"additionalProperties":false,"description":"The incident this finding opened. A finding links to at most one incident.","properties":{"id":{"description":"Display ID, for example `INC-12`.","type":"string"},"status":{"enum":["investigating","identified","monitoring","resolved"],"type":"string"},"title":{"type":"string"}},"required":["id","status","title"],"type":["object","null"]},"investigation_id":{"type":["string","null"]},"last_seen_at":{"format":"date-time","type":"string","description":"Start of the latest hour outside the band."},"muted_until":{"format":"date-time","type":["string","null"],"description":"While in the future, this finding does not open an incident."},"observed":{"type":["number","null"],"description":"The latest breaching evaluation's value."},"operation":{"type":["string","null"]},"project_id":{"format":"uuid","type":"string"},"resolved_at":{"format":"date-time","type":["string","null"]},"resolved_reason":{"description":"`corrected` means late data showed the series never left the band.","enum":["returned_to_band","corrected",null],"type":["string","null"]},"score":{"description":"Larger means further from normal. For ranking only.","type":"number"},"service":{"type":["string","null"]},"severity":{"enum":["warning","critical"],"type":"string"},"signal":{"enum":["latency_p95","error_rate","traffic_drop","error_logs","traffic"],"type":"string"},"source_kind":{"enum":["anomaly","rule","release_regression","slo_burn","agent_session","funnel"],"description":"Where the finding came from. Only `anomaly` is produced today.","type":"string"},"status":{"enum":["open","resolved"],"type":"string"},"summary":{"type":"string"},"title":{"type":"string"},"unit":{"enum":["ms","ratio","count"],"description":"`ratio` is a 0..1 fraction, for example an error rate.","type":"string"},"window_seconds":{"type":"integer"}},"required":["data_watermark","detector","direction","environment","evaluation_count","expected","first_seen_at","id","incident","investigation_id","last_seen_at","muted_until","observed","operation","project_id","resolved_at","resolved_reason","score","service","severity","signal","source_kind","status","summary","title","unit","window_seconds"],"type":"object"},"series":{"additionalProperties":false,"description":"Hourly values from 24 hours before the finding started to its end (or now), at most 7 days. Each point carries that hour's expected band.","properties":{"bucket_seconds":{"type":"integer"},"from":{"format":"date-time","type":"string"},"points":{"items":{"additionalProperties":false,"properties":{"at":{"format":"date-time","type":"string"},"expected_high":{"type":["number","null"]},"expected_low":{"type":["number","null"]},"value":{"type":["number","null"]}},"required":["at","expected_high","expected_low","value"],"type":"object"},"type":"array"},"to":{"format":"date-time","type":"string"},"unit":{"enum":["ms","ratio","count"],"description":"`ratio` is a 0..1 fraction, for example an error rate.","type":"string"}},"required":["bucket_seconds","from","points","to","unit"],"type":"object"}},"required":["evaluations","evidence","finding","series"],"type":"object"}}}},"404":{"description":"Finding not found in this project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/findings/{finding_id}/mute":{"post":{"operationId":"findings.mute","summary":"Mute or unmute a finding. A muted finding does not open an incident until `until`; its status does not change. Pass `until: null` to unmute. Needs `findings:write`.","description":"Mute or unmute a finding. A muted finding does not open an incident until `until`; its status does not change. Pass `until: null` to unmute. Needs `findings:write`.","tags":["findings"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"finding_id","in":"path","required":true,"description":"Path parameter finding_id","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"until":{"format":"date-time","type":["string","null"],"description":"Stop this finding from opening an incident until this time. Must be in the future and at most 30 days ahead. Null unmutes."}},"required":["until"],"type":"object"}}}},"responses":{"200":{"description":"The updated finding","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One detected deviation of one measured series (signal x service x environment), from the first hourly evaluation outside the expected band until the series is back inside the band.","properties":{"data_watermark":{"format":"date-time","type":"string","description":"Data newer than this was not complete when the finding was last evaluated."},"detector":{"additionalProperties":false,"properties":{"id":{"enum":["hourly_baseline","seasonal_hour_of_week"],"type":"string"},"version":{"type":"integer"}},"required":["id","version"],"type":"object"},"direction":{"description":"Which side of the expected band the observed value is on.","enum":["above","below"],"type":"string"},"environment":{"type":["string","null"]},"evaluation_count":{"description":"Hourly evaluations in this finding.","type":"integer"},"expected":{"additionalProperties":false,"properties":{"baseline":{"type":["number","null"]},"high":{"type":["number","null"]},"low":{"type":["number","null"]}},"required":["baseline","high","low"],"type":"object"},"first_seen_at":{"format":"date-time","type":"string","description":"Start of the first hour outside the band."},"id":{"format":"uuid","type":"string"},"incident":{"additionalProperties":false,"description":"The incident this finding opened. A finding links to at most one incident.","properties":{"id":{"description":"Display ID, for example `INC-12`.","type":"string"},"status":{"enum":["investigating","identified","monitoring","resolved"],"type":"string"},"title":{"type":"string"}},"required":["id","status","title"],"type":["object","null"]},"investigation_id":{"type":["string","null"]},"last_seen_at":{"format":"date-time","type":"string","description":"Start of the latest hour outside the band."},"muted_until":{"format":"date-time","type":["string","null"],"description":"While in the future, this finding does not open an incident."},"observed":{"type":["number","null"],"description":"The latest breaching evaluation's value."},"operation":{"type":["string","null"]},"project_id":{"format":"uuid","type":"string"},"resolved_at":{"format":"date-time","type":["string","null"]},"resolved_reason":{"description":"`corrected` means late data showed the series never left the band.","enum":["returned_to_band","corrected",null],"type":["string","null"]},"score":{"description":"Larger means further from normal. For ranking only.","type":"number"},"service":{"type":["string","null"]},"severity":{"enum":["warning","critical"],"type":"string"},"signal":{"enum":["latency_p95","error_rate","traffic_drop","error_logs","traffic"],"type":"string"},"source_kind":{"enum":["anomaly","rule","release_regression","slo_burn","agent_session","funnel"],"description":"Where the finding came from. Only `anomaly` is produced today.","type":"string"},"status":{"enum":["open","resolved"],"type":"string"},"summary":{"type":"string"},"title":{"type":"string"},"unit":{"enum":["ms","ratio","count"],"description":"`ratio` is a 0..1 fraction, for example an error rate.","type":"string"},"window_seconds":{"type":"integer"}},"required":["data_watermark","detector","direction","environment","evaluation_count","expected","first_seen_at","id","incident","investigation_id","last_seen_at","muted_until","observed","operation","project_id","resolved_at","resolved_reason","score","service","severity","signal","source_kind","status","summary","title","unit","window_seconds"],"type":"object"}}}},"404":{"description":"Finding not found in this project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/anomaly-policy":{"get":{"operationId":"findings.getAnomalyPolicy","summary":"Read the project's anomaly policy: whether anomaly checks run, the time zone for weekly comparison, how many hourly evaluations resolve a finding, and which anomalies start an incident. Needs `findings:read`.","description":"Read the project's anomaly policy: whether anomaly checks run, the time zone for weekly comparison, how many hourly evaluations resolve a finding, and which anomalies start an incident. Needs `findings:read`.","tags":["findings"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"The anomaly policy","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"enabled":{"description":"False turns off anomaly findings for this project.","type":"boolean"},"incident_rules":{"description":"Which anomalies start an incident. Empty (the default) means anomalies never start one.","items":{"additionalProperties":false,"properties":{"min_severity":{"enum":["warning","critical"],"type":"string"},"signal":{"description":"A signal, or `*` for every signal.","enum":["*","latency_p95","error_rate","traffic_drop","error_logs","traffic"],"type":"string"}},"required":["min_severity","signal"],"type":"object"},"type":"array"},"recovery_buckets":{"description":"Hourly evaluations back inside the band before a finding resolves.","maximum":24,"minimum":1,"type":"integer"},"timezone":{"description":"IANA zone. The seasonal check compares the same local hour of the week.","type":"string"},"updated_at":{"format":"date-time","type":["string","null"],"description":"Null when the project still uses the defaults."}},"required":["enabled","incident_rules","recovery_buckets","timezone","updated_at"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"findings.updateAnomalyPolicy","summary":"Update the project's anomaly policy. By default anomalies never start an incident; add `incident_rules` to start one (and page through the normal notification routes) for chosen signals and severities. Needs `findings:write`.","description":"Update the project's anomaly policy. By default anomalies never start an incident; add `incident_rules` to start one (and page through the normal notification routes) for chosen signals and severities. Needs `findings:write`.","tags":["findings"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"description":"Any subset of the policy fields. Omitted fields keep their value.","properties":{"enabled":{"description":"False turns off anomaly findings for this project.","type":"boolean"},"incident_rules":{"description":"Which anomalies start an incident. Empty (the default) means anomalies never start one.","items":{"additionalProperties":false,"properties":{"min_severity":{"enum":["warning","critical"],"type":"string"},"signal":{"description":"A signal, or `*` for every signal.","enum":["*","latency_p95","error_rate","traffic_drop","error_logs","traffic"],"type":"string"}},"required":["min_severity","signal"],"type":"object"},"type":"array"},"recovery_buckets":{"description":"Hourly evaluations back inside the band before a finding resolves.","maximum":24,"minimum":1,"type":"integer"},"timezone":{"description":"IANA zone. The seasonal check compares the same local hour of the week.","type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"The updated policy","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"enabled":{"description":"False turns off anomaly findings for this project.","type":"boolean"},"incident_rules":{"description":"Which anomalies start an incident. Empty (the default) means anomalies never start one.","items":{"additionalProperties":false,"properties":{"min_severity":{"enum":["warning","critical"],"type":"string"},"signal":{"description":"A signal, or `*` for every signal.","enum":["*","latency_p95","error_rate","traffic_drop","error_logs","traffic"],"type":"string"}},"required":["min_severity","signal"],"type":"object"},"type":"array"},"recovery_buckets":{"description":"Hourly evaluations back inside the band before a finding resolves.","maximum":24,"minimum":1,"type":"integer"},"timezone":{"description":"IANA zone. The seasonal check compares the same local hour of the week.","type":"string"},"updated_at":{"format":"date-time","type":["string","null"],"description":"Null when the project still uses the defaults."}},"required":["enabled","incident_rules","recovery_buckets","timezone","updated_at"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/on-call/schedules":{"get":{"operationId":"onCall.listSchedules","summary":"List on-call rotation schedules for the project's owning team (team-wide + project-scoped)","description":"List on-call rotation schedules for the project's owning team (team-wide + project-scoped)","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"onCall.createSchedule","summary":"Create a native on-call rotation. Defaults to team-wide; pass project_scoped=true to scope to this project.","description":"Create a native on-call rotation. Defaults to team-wide; pass project_scoped=true to scope to this project.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","timezone","handoff_day_of_week","handoff_local_time","members"],"properties":{"name":{"type":"string"},"timezone":{"type":"string"},"handoff_day_of_week":{"type":"integer"},"handoff_local_time":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"user_id":{"type":"string"}},"required":["user_id"],"additionalProperties":false}},"project_scoped":{"type":"boolean","description":"Scope to the authenticated project only"},"weeks_to_materialize":{"type":"integer"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Created schedule","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"team_id":{"type":"string"},"project_id":{"type":["string","null"]},"name":{"type":"string"},"timezone":{"type":"string"},"handoff_day_of_week":{"type":["integer","null"]},"handoff_local_time":{"type":["string","null"]},"source":{"type":"string","enum":["native","pagerduty","opsgenie","incident_io"]},"source_external_id":{"type":["string","null"]},"source_last_synced_at":{"type":["string","null"],"format":"date-time"},"enabled":{"type":"boolean"},"member_count":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","team_id","project_id","name","timezone","handoff_day_of_week","handoff_local_time","source","source_external_id","source_last_synced_at","enabled","member_count","created_at","updated_at"]}}}},"400":{"description":"Invalid schedule body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Caller lacks the on-call edit permission, or the organization already has the most schedules its plan allows","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/on-call/current":{"get":{"operationId":"onCall.getCurrentEngineer","summary":"Who is on-call for this project right now, with the covering schedule_id (nulls if nothing covers). Use onCall.whoIsOnCall for every schedule.","description":"Who is on-call for this project right now, with the covering schedule_id (nulls if nothing covers). Use onCall.whoIsOnCall for every schedule.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/on-call/schedules/{schedule_id}/members":{"get":{"operationId":"onCall.listMembers","summary":"List rotation members for a schedule in their cycling order","description":"List rotation members for a schedule in their cycling order","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"schedule_id","in":"path","required":true,"description":"Path parameter schedule_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/on-call/schedules/{schedule_id}/shifts":{"get":{"operationId":"onCall.listShifts","summary":"List shifts overlapping a time window (defaults to ±7d/+56d). Use ?from=ISO&to=ISO.","description":"List shifts overlapping a time window (defaults to ±7d/+56d). Use ?from=ISO&to=ISO.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"schedule_id","in":"path","required":true,"description":"Path parameter schedule_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Query parameter from","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Query parameter to","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Shifts overlapping the window","content":{"application/json":{"schema":{"type":"object","properties":{"shifts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"schedule_id":{"type":"string"},"user_id":{"type":["string","null"]},"starts_at":{"type":"string","format":"date-time"},"ends_at":{"type":"string","format":"date-time"},"source":{"type":"string","enum":["computed","override","imported"]},"created_at":{"type":"string","format":"date-time"}},"required":["id","schedule_id","user_id","starts_at","ends_at","source","created_at"]}}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/on-call/schedules/{schedule_id}":{"patch":{"operationId":"onCall.setScheduleEnabled","summary":"Enable or disable a schedule. Disabled schedules are skipped by the failed-triage handoff.","description":"Enable or disable a schedule. Disabled schedules are skipped by the failed-triage handoff.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"schedule_id","in":"path","required":true,"description":"Path parameter schedule_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated schedule","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"team_id":{"type":"string"},"project_id":{"type":["string","null"]},"name":{"type":"string"},"timezone":{"type":"string"},"handoff_day_of_week":{"type":["integer","null"]},"handoff_local_time":{"type":["string","null"]},"source":{"type":"string","enum":["native","pagerduty","opsgenie","incident_io"]},"source_external_id":{"type":["string","null"]},"source_last_synced_at":{"type":["string","null"],"format":"date-time"},"enabled":{"type":"boolean"},"member_count":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","team_id","project_id","name","timezone","handoff_day_of_week","handoff_local_time","source","source_external_id","source_last_synced_at","enabled","member_count","created_at","updated_at"]}}}},"404":{"description":"Schedule not found in this team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"onCall.deleteSchedule","summary":"Delete a rotation with its members, layers, and shifts. Refused while an escalation policy targets it, unless force=true.","description":"Delete a rotation with its members, layers, and shifts. Refused while an escalation policy targets it, unless force=true.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"schedule_id","in":"path","required":true,"description":"Path parameter schedule_id","schema":{"type":"string"}},{"name":"force","in":"query","required":false,"description":"Delete even when escalation policies target the rotation.","schema":{"type":"boolean"}}],"responses":{"204":{"description":"Rotation deleted"},"404":{"description":"Schedule not found in this team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Escalation policies still target the rotation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/on-call/schedules/{schedule_id}/overrides":{"post":{"operationId":"onCall.createOverride","summary":"Add a one-off override (swap shifts). Override wins the on-call lookup for its window.","description":"Add a one-off override (swap shifts). Override wins the on-call lookup for its window.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"schedule_id","in":"path","required":true,"description":"Path parameter schedule_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["user_id","starts_at","ends_at"],"properties":{"user_id":{"type":"string"},"starts_at":{"type":"string","format":"date-time"},"ends_at":{"type":"string","format":"date-time"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Override created"},"400":{"description":"Invalid override window","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Schedule not found in this team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/on-call/schedules/{schedule_id}/shifts.ics":{"get":{"operationId":"onCall.listShiftsCsv","summary":"Subscribe-able iCalendar feed of shifts for the schedule. Agents and humans can paste this into Google/Apple Calendar.","description":"Subscribe-able iCalendar feed of shifts for the schedule. Agents and humans can paste this into Google/Apple Calendar.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"schedule_id","in":"path","required":true,"description":"Path parameter schedule_id","schema":{"type":"string"}}],"responses":{"200":{"description":"iCalendar text/calendar feed of shifts"},"404":{"description":"Schedule not found in this team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/on-call/escalation-policies":{"get":{"operationId":"onCall.listEscalationPolicies","summary":"List escalation policies for the project's team (team-wide and scoped to this project)","description":"List escalation policies for the project's team (team-wide and scoped to this project)","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Escalation policies","content":{"application/json":{"schema":{"type":"object","required":["policies"],"properties":{"policies":{"type":"array","items":{"type":"object","required":["id","team_id","project_id","name","description","loop_count","levels","enabled","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"team_id":{"type":"string"},"project_id":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"loop_count":{"type":"integer"},"levels":{"type":"array","items":{"type":"object","required":["targets","steps"],"properties":{"targets":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","schedule_id"],"properties":{"type":{"type":"string","enum":["schedule"]},"schedule_id":{"type":"string","format":"uuid"}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["user"]},"user_id":{"type":"string"}},"additionalProperties":false}]}},"steps":{"type":"array","items":{"type":"object","required":["channel","wait_seconds","repeat"],"properties":{"channel":{"type":"string","enum":["sms","voice","teams"]},"destination_id":{"type":"string","format":"uuid","description":"Teams steps only: a Microsoft Teams notification destination of the team"},"wait_seconds":{"type":"integer"},"repeat":{"type":"integer"}}}}}}},"enabled":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"onCall.createEscalationPolicy","summary":"Create an escalation policy: ordered levels of schedule or user targets, each with SMS and voice steps. Attach it to a notification route with an `oncall_escalation` destination.","description":"Create an escalation policy: ordered levels of schedule or user targets, each with SMS and voice steps. Attach it to a notification route with an `oncall_escalation` destination.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","levels"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":["string","null"],"maxLength":2000},"loop_count":{"type":"integer","minimum":0,"maximum":9,"description":"Extra passes through all levels after the first (default 1)"},"levels":{"type":"array","items":{"type":"object","required":["targets"],"properties":{"targets":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","schedule_id"],"properties":{"type":{"type":"string","enum":["schedule"]},"schedule_id":{"type":"string","format":"uuid"}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["user"]},"user_id":{"type":"string"}},"additionalProperties":false}]},"minItems":1,"maxItems":10},"steps":{"type":"array","items":{"type":"object","required":["channel"],"properties":{"channel":{"type":"string","enum":["sms","voice","teams"]},"destination_id":{"type":"string","format":"uuid","description":"Teams steps only: a Microsoft Teams notification destination of the team"},"wait_seconds":{"type":"integer","minimum":15,"maximum":3600,"description":"Default 60"},"repeat":{"type":"integer","minimum":1,"maximum":5,"description":"Default 1"}},"additionalProperties":false},"minItems":1,"maxItems":10,"description":"Default: sms (wait 60 s), then voice with repeat 2 (wait 60 s)"}},"additionalProperties":false},"minItems":1,"maxItems":10},"enabled":{"type":"boolean"},"project_scoped":{"type":"boolean","description":"Scope to the authenticated project only"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Created escalation policy","content":{"application/json":{"schema":{"type":"object","required":["policy"],"properties":{"policy":{"type":"object","required":["id","team_id","project_id","name","description","loop_count","levels","enabled","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"team_id":{"type":"string"},"project_id":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"loop_count":{"type":"integer"},"levels":{"type":"array","items":{"type":"object","required":["targets","steps"],"properties":{"targets":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","schedule_id"],"properties":{"type":{"type":"string","enum":["schedule"]},"schedule_id":{"type":"string","format":"uuid"}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["user"]},"user_id":{"type":"string"}},"additionalProperties":false}]}},"steps":{"type":"array","items":{"type":"object","required":["channel","wait_seconds","repeat"],"properties":{"channel":{"type":"string","enum":["sms","voice","teams"]},"destination_id":{"type":"string","format":"uuid","description":"Teams steps only: a Microsoft Teams notification destination of the team"},"wait_seconds":{"type":"integer"},"repeat":{"type":"integer"}}}}}}},"enabled":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid policy body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"A target schedule or user is not in this team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/on-call/escalation-policies/{policy_id}":{"get":{"operationId":"onCall.getEscalationPolicy","summary":"Get one escalation policy","description":"Get one escalation policy","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"policy_id","in":"path","required":true,"description":"Path parameter policy_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Escalation policy","content":{"application/json":{"schema":{"type":"object","required":["policy"],"properties":{"policy":{"type":"object","required":["id","team_id","project_id","name","description","loop_count","levels","enabled","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"team_id":{"type":"string"},"project_id":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"loop_count":{"type":"integer"},"levels":{"type":"array","items":{"type":"object","required":["targets","steps"],"properties":{"targets":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","schedule_id"],"properties":{"type":{"type":"string","enum":["schedule"]},"schedule_id":{"type":"string","format":"uuid"}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["user"]},"user_id":{"type":"string"}},"additionalProperties":false}]}},"steps":{"type":"array","items":{"type":"object","required":["channel","wait_seconds","repeat"],"properties":{"channel":{"type":"string","enum":["sms","voice","teams"]},"destination_id":{"type":"string","format":"uuid","description":"Teams steps only: a Microsoft Teams notification destination of the team"},"wait_seconds":{"type":"integer"},"repeat":{"type":"integer"}}}}}}},"enabled":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"404":{"description":"Escalation policy not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"onCall.updateEscalationPolicy","summary":"Update an escalation policy. Send only the fields to change.","description":"Update an escalation policy. Send only the fields to change.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"policy_id","in":"path","required":true,"description":"Path parameter policy_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":["string","null"],"maxLength":2000},"loop_count":{"type":"integer","minimum":0,"maximum":9,"description":"Extra passes through all levels after the first (default 1)"},"levels":{"type":"array","items":{"type":"object","required":["targets"],"properties":{"targets":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","schedule_id"],"properties":{"type":{"type":"string","enum":["schedule"]},"schedule_id":{"type":"string","format":"uuid"}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["user"]},"user_id":{"type":"string"}},"additionalProperties":false}]},"minItems":1,"maxItems":10},"steps":{"type":"array","items":{"type":"object","required":["channel"],"properties":{"channel":{"type":"string","enum":["sms","voice","teams"]},"destination_id":{"type":"string","format":"uuid","description":"Teams steps only: a Microsoft Teams notification destination of the team"},"wait_seconds":{"type":"integer","minimum":15,"maximum":3600,"description":"Default 60"},"repeat":{"type":"integer","minimum":1,"maximum":5,"description":"Default 1"}},"additionalProperties":false},"minItems":1,"maxItems":10,"description":"Default: sms (wait 60 s), then voice with repeat 2 (wait 60 s)"}},"additionalProperties":false},"minItems":1,"maxItems":10},"enabled":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated escalation policy","content":{"application/json":{"schema":{"type":"object","required":["policy"],"properties":{"policy":{"type":"object","required":["id","team_id","project_id","name","description","loop_count","levels","enabled","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"team_id":{"type":"string"},"project_id":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"loop_count":{"type":"integer"},"levels":{"type":"array","items":{"type":"object","required":["targets","steps"],"properties":{"targets":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","schedule_id"],"properties":{"type":{"type":"string","enum":["schedule"]},"schedule_id":{"type":"string","format":"uuid"}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["user"]},"user_id":{"type":"string"}},"additionalProperties":false}]}},"steps":{"type":"array","items":{"type":"object","required":["channel","wait_seconds","repeat"],"properties":{"channel":{"type":"string","enum":["sms","voice","teams"]},"destination_id":{"type":"string","format":"uuid","description":"Teams steps only: a Microsoft Teams notification destination of the team"},"wait_seconds":{"type":"integer"},"repeat":{"type":"integer"}}}}}}},"enabled":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid policy body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Escalation policy not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"A target schedule or user is not in this team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"onCall.deleteEscalationPolicy","summary":"Delete an escalation policy","description":"Delete an escalation policy","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"policy_id","in":"path","required":true,"description":"Path parameter policy_id","schema":{"type":"string"}}],"responses":{"204":{"description":"Escalation policy deleted"},"404":{"description":"Escalation policy not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/on-call/schedules/{schedule_id}/layers":{"get":{"operationId":"onCall.listLayers","summary":"List the rotation layers of a schedule in priority order","description":"List the rotation layers of a schedule in priority order","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"schedule_id","in":"path","required":true,"description":"Path parameter schedule_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Rotation layers","content":{"application/json":{"schema":{"type":"object","required":["layers"],"properties":{"layers":{"type":"array","items":{"type":"object","required":["id","name","position","rotation_kind","rotation_length_hours","handoff_local_time","anchor_date","member_user_ids"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"position":{"type":"integer"},"rotation_kind":{"type":"string","enum":["daily","weekly","custom"]},"rotation_length_hours":{"type":"integer"},"handoff_local_time":{"type":"string"},"anchor_date":{"type":"string"},"member_user_ids":{"type":"array","items":{"type":"string"}}}}}}}}}},"404":{"description":"Schedule not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"onCall.replaceLayers","summary":"Replace all rotation layers of a native schedule (max 10). Later layers win where layers overlap.","description":"Replace all rotation layers of a native schedule (max 10). Later layers win where layers overlap.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"schedule_id","in":"path","required":true,"description":"Path parameter schedule_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["layers"],"properties":{"layers":{"type":"array","maxItems":10,"description":"Later entries win where layers overlap","items":{"type":"object","required":["name","rotation_kind","handoff_local_time","anchor_date","member_user_ids"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"rotation_kind":{"type":"string","enum":["daily","weekly","custom"]},"rotation_length_hours":{"type":"integer","minimum":1,"maximum":8760,"description":"Required for custom rotations only"},"handoff_local_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"anchor_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"member_user_ids":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":50}},"additionalProperties":false}}},"additionalProperties":false}}}},"responses":{"200":{"description":"Saved rotation layers","content":{"application/json":{"schema":{"type":"object","required":["layers"],"properties":{"layers":{"type":"array","items":{"type":"object","required":["id","name","position","rotation_kind","rotation_length_hours","handoff_local_time","anchor_date","member_user_ids"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"position":{"type":"integer"},"rotation_kind":{"type":"string","enum":["daily","weekly","custom"]},"rotation_length_hours":{"type":"integer"},"handoff_local_time":{"type":"string"},"anchor_date":{"type":"string"},"member_user_ids":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"Invalid layers body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Schedule not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Imported schedules are managed by their source system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"A member is not in this organization, or the timezone is invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/on-call/schedules/{schedule_id}/final":{"get":{"operationId":"onCall.getFinalSchedule","summary":"Final on-call timeline for a schedule after layers and overrides. Window defaults to now..+14 days; at most 92 days.","description":"Final on-call timeline for a schedule after layers and overrides. Window defaults to now..+14 days; at most 92 days.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"schedule_id","in":"path","required":true,"description":"Path parameter schedule_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Query parameter from","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Query parameter to","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Final schedule segments","content":{"application/json":{"schema":{"type":"object","required":["segments"],"properties":{"segments":{"type":"array","items":{"type":"object","required":["user_id","source","starts_at","ends_at"],"properties":{"user_id":{"type":"string"},"source":{"type":"string","enum":["override","layer","shift"]},"starts_at":{"type":"string","format":"date-time"},"ends_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Invalid window","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Schedule not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/on-call/now":{"get":{"operationId":"onCall.whoIsOnCall","summary":"Who is on call now for every enabled schedule that covers the project, with the source and end of each shift","description":"Who is on call now for every enabled schedule that covers the project, with the source and end of each shift","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Current on-call users","content":{"application/json":{"schema":{"type":"object","required":["on_call"],"properties":{"on_call":{"type":"array","items":{"type":"object","required":["schedule_id","schedule_name","project_id","user_id","source","layer_id","until"],"properties":{"schedule_id":{"type":"string"},"schedule_name":{"type":"string"},"project_id":{"type":["string","null"]},"user_id":{"type":["string","null"]},"source":{"type":["string","null"],"enum":["override","layer","shift",null]},"layer_id":{"type":["string","null"]},"until":{"type":["string","null"],"format":"date-time"}}}}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/on-call/usage":{"get":{"operationId":"onCall.getUsage","summary":"SMS and voice paging attempt counts for the project's organization in one calendar month (UTC)","description":"SMS and voice paging attempt counts for the project's organization in one calendar month (UTC)","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"month","in":"query","required":false,"description":"YYYY-MM. Default: the current month.","schema":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$"}}],"responses":{"200":{"description":"Paging usage","content":{"application/json":{"schema":{"type":"object","required":["month","sms","voice"],"properties":{"month":{"type":"string","pattern":"^\\d{4}-\\d{2}$"},"sms":{"type":"integer","description":"SMS attempts this month"},"voice":{"type":"integer","description":"Voice call attempts this month"}}}}}},"400":{"description":"month must be YYYY-MM","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/on-call/pages":{"get":{"operationId":"onCall.listPages","summary":"List on-call pages (escalation runs) for the project, newest first","description":"List on-call pages (escalation runs) for the project, newest first","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"query","required":false,"description":"Public incident id (inc_12) or internal UUID","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Query parameter status","schema":{"type":"string","enum":["triggered","notifying","acknowledged","resolved","exhausted"]}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"On-call pages","content":{"application/json":{"schema":{"type":"object","required":["pages"],"properties":{"pages":{"type":"array","items":{"type":"object","required":["id","incident_id","status","policy_id","policy_name","loop","level","step","loop_count","levels","triggered_at","next_action_at","acknowledged_at","acknowledged_by","ack_source","resolved_at","exhausted_at"],"properties":{"id":{"type":"string","format":"uuid"},"incident_id":{"type":"string"},"status":{"type":"string","enum":["triggered","notifying","acknowledged","resolved","exhausted"]},"policy_id":{"type":["string","null"]},"policy_name":{"type":"string"},"loop":{"type":"integer"},"level":{"type":"integer"},"step":{"type":"integer"},"loop_count":{"type":"integer"},"levels":{"type":"array","items":{"type":"object","required":["targets","steps"],"properties":{"targets":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","schedule_id"],"properties":{"type":{"type":"string","enum":["schedule"]},"schedule_id":{"type":"string","format":"uuid"}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["user"]},"user_id":{"type":"string"}},"additionalProperties":false}]}},"steps":{"type":"array","items":{"type":"object","required":["channel","wait_seconds","repeat"],"properties":{"channel":{"type":"string","enum":["sms","voice","teams"]},"destination_id":{"type":"string","format":"uuid","description":"Teams steps only: a Microsoft Teams notification destination of the team"},"wait_seconds":{"type":"integer"},"repeat":{"type":"integer"}}}}}}},"triggered_at":{"type":"string","format":"date-time"},"next_action_at":{"type":["string","null"],"format":"date-time"},"acknowledged_at":{"type":["string","null"],"format":"date-time"},"acknowledged_by":{"type":["string","null"]},"ack_source":{"type":["string","null"],"enum":["sms","voice","dashboard","api","incident",null]},"resolved_at":{"type":["string","null"],"format":"date-time"},"exhausted_at":{"type":["string","null"],"format":"date-time"}}}}}}}}},"400":{"description":"Invalid query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/on-call/pages/{page_id}":{"get":{"operationId":"onCall.getPage","summary":"Get one on-call page with its SMS, voice, and Microsoft Teams attempt timeline","description":"Get one on-call page with its SMS, voice, and Microsoft Teams attempt timeline","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"page_id","in":"path","required":true,"description":"Path parameter page_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Page with attempts","content":{"application/json":{"schema":{"type":"object","required":["page"],"properties":{"page":{"type":"object","required":["id","incident_id","status","policy_id","policy_name","loop","level","step","loop_count","levels","triggered_at","next_action_at","acknowledged_at","acknowledged_by","ack_source","resolved_at","exhausted_at","attempts"],"properties":{"id":{"type":"string","format":"uuid"},"incident_id":{"type":"string"},"status":{"type":"string","enum":["triggered","notifying","acknowledged","resolved","exhausted"]},"policy_id":{"type":["string","null"]},"policy_name":{"type":"string"},"loop":{"type":"integer"},"level":{"type":"integer"},"step":{"type":"integer"},"loop_count":{"type":"integer"},"levels":{"type":"array","items":{"type":"object","required":["targets","steps"],"properties":{"targets":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","schedule_id"],"properties":{"type":{"type":"string","enum":["schedule"]},"schedule_id":{"type":"string","format":"uuid"}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["user"]},"user_id":{"type":"string"}},"additionalProperties":false}]}},"steps":{"type":"array","items":{"type":"object","required":["channel","wait_seconds","repeat"],"properties":{"channel":{"type":"string","enum":["sms","voice","teams"]},"destination_id":{"type":"string","format":"uuid","description":"Teams steps only: a Microsoft Teams notification destination of the team"},"wait_seconds":{"type":"integer"},"repeat":{"type":"integer"}}}}}}},"triggered_at":{"type":"string","format":"date-time"},"next_action_at":{"type":["string","null"],"format":"date-time"},"acknowledged_at":{"type":["string","null"],"format":"date-time"},"acknowledged_by":{"type":["string","null"]},"ack_source":{"type":["string","null"],"enum":["sms","voice","dashboard","api","incident",null]},"resolved_at":{"type":["string","null"],"format":"date-time"},"exhausted_at":{"type":["string","null"],"format":"date-time"},"attempts":{"type":"array","items":{"type":"object","required":["id","channel","status","user_id","to","loop","level","step","answered_by","error_message","segments","duration_seconds","created_at","completed_at"],"properties":{"id":{"type":"string","format":"uuid"},"channel":{"type":"string","enum":["sms","voice","push","teams"]},"status":{"type":"string","enum":["claimed","skipped","blocked","queued","sent","delivered","failed","answered","no_answer","busy","machine","acknowledged"]},"user_id":{"type":["string","null"]},"to":{"type":["string","null"],"description":"Masked phone number"},"loop":{"type":"integer"},"level":{"type":"integer"},"step":{"type":"integer"},"answered_by":{"type":["string","null"],"enum":["human","machine","unknown",null]},"error_message":{"type":["string","null"]},"segments":{"type":["integer","null"]},"duration_seconds":{"type":["integer","null"]},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"}}}}}}}}}}},"404":{"description":"Page not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/on-call/pages/{page_id}/ack":{"post":{"operationId":"onCall.acknowledgePage","summary":"Acknowledge an on-call page. This stops the escalation and acknowledges the incident. Needs the incidents:write scope.","description":"Acknowledge an on-call page. This stops the escalation and acknowledges the incident. Needs the incidents:write scope.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"page_id","in":"path","required":true,"description":"Path parameter page_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Acknowledged page","content":{"application/json":{"schema":{"type":"object","required":["page"],"properties":{"page":{"type":"object","required":["id","incident_id","status","policy_id","policy_name","loop","level","step","loop_count","levels","triggered_at","next_action_at","acknowledged_at","acknowledged_by","ack_source","resolved_at","exhausted_at"],"properties":{"id":{"type":"string","format":"uuid"},"incident_id":{"type":"string"},"status":{"type":"string","enum":["triggered","notifying","acknowledged","resolved","exhausted"]},"policy_id":{"type":["string","null"]},"policy_name":{"type":"string"},"loop":{"type":"integer"},"level":{"type":"integer"},"step":{"type":"integer"},"loop_count":{"type":"integer"},"levels":{"type":"array","items":{"type":"object","required":["targets","steps"],"properties":{"targets":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","schedule_id"],"properties":{"type":{"type":"string","enum":["schedule"]},"schedule_id":{"type":"string","format":"uuid"}},"additionalProperties":false},{"type":"object","required":["type","user_id"],"properties":{"type":{"type":"string","enum":["user"]},"user_id":{"type":"string"}},"additionalProperties":false}]}},"steps":{"type":"array","items":{"type":"object","required":["channel","wait_seconds","repeat"],"properties":{"channel":{"type":"string","enum":["sms","voice","teams"]},"destination_id":{"type":"string","format":"uuid","description":"Teams steps only: a Microsoft Teams notification destination of the team"},"wait_seconds":{"type":"integer"},"repeat":{"type":"integer"}}}}}}},"triggered_at":{"type":"string","format":"date-time"},"next_action_at":{"type":["string","null"],"format":"date-time"},"acknowledged_at":{"type":["string","null"],"format":"date-time"},"acknowledged_by":{"type":["string","null"]},"ack_source":{"type":["string","null"],"enum":["sms","voice","dashboard","api","incident",null]},"resolved_at":{"type":["string","null"],"format":"date-time"},"exhausted_at":{"type":["string","null"],"format":"date-time"}}}}}}}},"404":{"description":"Page not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Page is already acknowledged, resolved, or exhausted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/on-call/contact-methods":{"get":{"operationId":"onCall.listContactMethods","summary":"List the signed-in user's phone numbers for paging. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","description":"List the signed-in user's phone numbers for paging. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact methods","content":{"application/json":{"schema":{"type":"object","required":["contact_methods"],"properties":{"contact_methods":{"type":"array","items":{"type":"object","required":["id","kind","phone_number","country_code","label","sms_enabled","voice_enabled","verified_at","verification_sent_at","consented_at","sms_opted_out_at","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["phone"]},"phone_number":{"type":"string","description":"E.164 phone number"},"country_code":{"type":["string","null"]},"label":{"type":["string","null"]},"sms_enabled":{"type":"boolean"},"voice_enabled":{"type":"boolean"},"verified_at":{"type":["string","null"],"format":"date-time"},"verification_sent_at":{"type":["string","null"],"format":"date-time"},"consented_at":{"type":["string","null"],"format":"date-time"},"sms_opted_out_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"}}}}}}}}},"403":{"description":"API keys cannot manage contact methods","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"onCall.addContactMethod","summary":"Add a phone number (E.164) for paging. consent must be true. Verify the number before it can receive pages. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","description":"Add a phone number (E.164) for paging. consent must be true. Verify the number before it can receive pages. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["phone_number","consent"],"properties":{"phone_number":{"type":"string","minLength":4,"maxLength":32,"description":"E.164 phone number, for example +14155550123"},"label":{"type":["string","null"],"maxLength":64},"consent":{"type":"boolean","enum":[true],"description":"The user agrees to receive automated alert texts and calls"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Contact method","content":{"application/json":{"schema":{"type":"object","required":["contact_method"],"properties":{"contact_method":{"type":"object","required":["id","kind","phone_number","country_code","label","sms_enabled","voice_enabled","verified_at","verification_sent_at","consented_at","sms_opted_out_at","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["phone"]},"phone_number":{"type":"string","description":"E.164 phone number"},"country_code":{"type":["string","null"]},"label":{"type":["string","null"]},"sms_enabled":{"type":"boolean"},"voice_enabled":{"type":"boolean"},"verified_at":{"type":["string","null"],"format":"date-time"},"verification_sent_at":{"type":["string","null"],"format":"date-time"},"consented_at":{"type":["string","null"],"format":"date-time"},"sms_opted_out_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid phone number or missing consent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"API keys cannot manage contact methods","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/on-call/contact-methods/{contact_method_id}":{"patch":{"operationId":"onCall.updateContactMethod","summary":"Turn SMS or voice paging on or off for one of your phone numbers. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","description":"Turn SMS or voice paging on or off for one of your phone numbers. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"contact_method_id","in":"path","required":true,"description":"Path parameter contact_method_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sms_enabled":{"type":"boolean"},"voice_enabled":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated contact method","content":{"application/json":{"schema":{"type":"object","required":["contact_method"],"properties":{"contact_method":{"type":"object","required":["id","kind","phone_number","country_code","label","sms_enabled","voice_enabled","verified_at","verification_sent_at","consented_at","sms_opted_out_at","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["phone"]},"phone_number":{"type":"string","description":"E.164 phone number"},"country_code":{"type":["string","null"]},"label":{"type":["string","null"]},"sms_enabled":{"type":"boolean"},"voice_enabled":{"type":"boolean"},"verified_at":{"type":["string","null"],"format":"date-time"},"verification_sent_at":{"type":["string","null"],"format":"date-time"},"consented_at":{"type":["string","null"],"format":"date-time"},"sms_opted_out_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"API keys cannot manage contact methods","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Contact method not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"onCall.deleteContactMethod","summary":"Remove one of your phone numbers. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","description":"Remove one of your phone numbers. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"contact_method_id","in":"path","required":true,"description":"Path parameter contact_method_id","schema":{"type":"string"}}],"responses":{"204":{"description":"Contact method deleted"},"403":{"description":"API keys cannot manage contact methods","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Contact method not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/on-call/contact-methods/{contact_method_id}/verification":{"post":{"operationId":"onCall.sendContactVerification","summary":"Text a verification code to one of your phone numbers. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","description":"Text a verification code to one of your phone numbers. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"contact_method_id","in":"path","required":true,"description":"Path parameter contact_method_id","schema":{"type":"string"}}],"responses":{"200":{"description":"The number is already verified","content":{"application/json":{"schema":{"type":"object","required":["contact_method"],"properties":{"contact_method":{"type":"object","required":["id","kind","phone_number","country_code","label","sms_enabled","voice_enabled","verified_at","verification_sent_at","consented_at","sms_opted_out_at","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["phone"]},"phone_number":{"type":"string","description":"E.164 phone number"},"country_code":{"type":["string","null"]},"label":{"type":["string","null"]},"sms_enabled":{"type":"boolean"},"voice_enabled":{"type":"boolean"},"verified_at":{"type":["string","null"],"format":"date-time"},"verification_sent_at":{"type":["string","null"],"format":"date-time"},"consented_at":{"type":["string","null"],"format":"date-time"},"sms_opted_out_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"}}}}}}}},"202":{"description":"Code sent","content":{"application/json":{"schema":{"type":"object","required":["sent"],"properties":{"sent":{"type":"boolean","enum":[true]}}}}}},"403":{"description":"API keys cannot manage contact methods","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Contact method not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Too many codes requested; try again later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Phone verification is not available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/on-call/contact-methods/{contact_method_id}/verify":{"post":{"operationId":"onCall.verifyContactMethod","summary":"Check the verification code for one of your phone numbers. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","description":"Check the verification code for one of your phone numbers. Needs a signed-in user session; API keys get 403 because contact methods belong to a person.","tags":["onCall"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"contact_method_id","in":"path","required":true,"description":"Path parameter contact_method_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","pattern":"^\\d{4,10}$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Verified contact method","content":{"application/json":{"schema":{"type":"object","required":["contact_method"],"properties":{"contact_method":{"type":"object","required":["id","kind","phone_number","country_code","label","sms_enabled","voice_enabled","verified_at","verification_sent_at","consented_at","sms_opted_out_at","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["phone"]},"phone_number":{"type":"string","description":"E.164 phone number"},"country_code":{"type":["string","null"]},"label":{"type":["string","null"]},"sms_enabled":{"type":"boolean"},"voice_enabled":{"type":"boolean"},"verified_at":{"type":["string","null"],"format":"date-time"},"verification_sent_at":{"type":["string","null"],"format":"date-time"},"consented_at":{"type":["string","null"],"format":"date-time"},"sms_opted_out_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"The code is not correct","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"API keys cannot manage contact methods","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Contact method not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The code expired; request a new one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Too many incorrect codes; request a new one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/incidents":{"get":{"operationId":"incidents.list","summary":"List incidents for a project with status, severity, and monitor filters","description":"List incidents for a project with status, severity, and monitor filters","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"incidents.create","summary":"Open an incident by hand; it starts as investigating","description":"Open an incident by hand; it starts as investigating","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"severity":{"type":"string","description":"A severity level key of the project, for example `sev-1`."},"summary":{"type":"string","description":"What responders know so far."},"title":{"type":"string","minLength":1}},"required":["severity","title"],"additionalProperties":false}}}},"responses":{"201":{"description":"Opened incident","content":{"application/json":{"schema":{"type":"object","properties":{"postmortemUrl":{"type":["string","null"],"format":"uri"},"publicTitle":{"type":["string","null"]},"publicSummary":{"type":["string","null"]},"publishedAt":{"type":["string","null"],"format":"date-time"},"publishedToStatusPageId":{"type":["string","null"]},"acknowledgedAt":{"type":["string","null"],"format":"date-time"},"aiAssigned":{"type":"boolean"},"assignedTo":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"monitorId":{"type":["string","null"]},"monitorName":{"type":["string","null"]},"resolvedAt":{"type":["string","null"],"format":"date-time"},"responseSummary":{"type":["string","null"]},"rootCause":{"type":["string","null"]},"severity":{"type":"string"},"source":{"type":"object","description":"Where the incident came from: the monitor, alert connector, provider connection, or person. `kind` equals `sourceType`.","properties":{"declaredBy":{"type":["object","null"],"description":"The user who declared a manual incident.","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"externalId":{"type":["string","null"],"description":"The provider's alert, alarm, or issue ID that opened an integration incident."},"id":{"type":["string","null"],"description":"Monitor ID, finding ID, or the alert connector or provider connection ID."},"kind":{"type":"string","enum":["manual","monitor","heartbeat","integration","finding"]},"name":{"type":["string","null"],"description":"Monitor name, alert connector label, or provider account name."},"provider":{"type":["string","null"],"description":"Integration provider key, for example `datadog`, `aws_cloudwatch`, or `sentry`."},"url":{"type":["string","null"],"format":"uri","description":"Link back to the alert: its page in the provider, else the first page the sender linked. Null when none is known."}},"required":["declaredBy","externalId","id","kind","name","provider","url"]},"sourceType":{"type":"string"},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]},"suggestedControls":{"type":["string","null"]},"summary":{"type":["string","null"]},"suspectDeployment":{"type":["object","null"],"properties":{"deployedAt":{"type":"string","format":"date-time"},"gapSeconds":{"type":"integer"},"id":{"type":"string"},"service":{"type":["string","null"]},"version":{"type":["string","null"]}},"required":["deployedAt","gapSeconds","id","service","version"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["acknowledgedAt","aiAssigned","assignedTo","createdAt","id","monitorId","monitorName","resolvedAt","responseSummary","rootCause","severity","source","sourceType","status","suggestedControls","summary","suspectDeployment","title","updatedAt"]}}}},"422":{"description":"Invalid title or unknown severity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/incidents/{incident_id}":{"get":{"operationId":"incidents.get","summary":"Get one incident including timeline, evidence, and recent checks","description":"Get one incident including timeline, evidence, and recent checks","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Incident detail","content":{"application/json":{"schema":{"type":"object","properties":{"evidence":{"type":"array","items":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"kind":{"type":"string"},"query":{"type":"string"},"summary":{"type":["string","null"]},"title":{"type":"string"}},"required":["createdAt","id","kind","query","summary","title"]}},"events":{"type":"array","items":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"createdBy":{"type":["string","null"]},"id":{"type":"string"},"kind":{"type":"string"},"message":{"type":"string"}},"required":["createdAt","createdBy","id","kind","message"]}},"incident":{"type":"object","properties":{"postmortemUrl":{"type":["string","null"],"format":"uri"},"publicTitle":{"type":["string","null"]},"publicSummary":{"type":["string","null"]},"publishedAt":{"type":["string","null"],"format":"date-time"},"publishedToStatusPageId":{"type":["string","null"]},"acknowledgedAt":{"type":["string","null"],"format":"date-time"},"aiAssigned":{"type":"boolean"},"assignedTo":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"monitorId":{"type":["string","null"]},"monitorName":{"type":["string","null"]},"resolvedAt":{"type":["string","null"],"format":"date-time"},"responseSummary":{"type":["string","null"]},"rootCause":{"type":["string","null"]},"severity":{"type":"string"},"source":{"type":"object","description":"Where the incident came from: the monitor, alert connector, provider connection, or person. `kind` equals `sourceType`.","properties":{"declaredBy":{"type":["object","null"],"description":"The user who declared a manual incident.","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"externalId":{"type":["string","null"],"description":"The provider's alert, alarm, or issue ID that opened an integration incident."},"id":{"type":["string","null"],"description":"Monitor ID, finding ID, or the alert connector or provider connection ID."},"kind":{"type":"string","enum":["manual","monitor","heartbeat","integration","finding"]},"name":{"type":["string","null"],"description":"Monitor name, alert connector label, or provider account name."},"provider":{"type":["string","null"],"description":"Integration provider key, for example `datadog`, `aws_cloudwatch`, or `sentry`."},"url":{"type":["string","null"],"format":"uri","description":"Link back to the alert: its page in the provider, else the first page the sender linked. Null when none is known."}},"required":["declaredBy","externalId","id","kind","name","provider","url"]},"sourceType":{"type":"string"},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]},"suggestedControls":{"type":["string","null"]},"summary":{"type":["string","null"]},"suspectDeployment":{"type":["object","null"],"properties":{"deployedAt":{"type":"string","format":"date-time"},"gapSeconds":{"type":"integer"},"id":{"type":"string"},"service":{"type":["string","null"]},"version":{"type":["string","null"]}},"required":["deployedAt","gapSeconds","id","service","version"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["acknowledgedAt","aiAssigned","assignedTo","createdAt","id","monitorId","monitorName","resolvedAt","responseSummary","rootCause","severity","source","sourceType","status","suggestedControls","summary","suspectDeployment","title","updatedAt"]},"recentChecks":{"type":"array","items":{"type":"object","properties":{"checkedAt":{"type":"string","format":"date-time"},"errorMessage":{"type":["string","null"]},"id":{"type":"string"},"latencyMs":{"type":["integer","null"]},"metadata":{"type":["object","null"],"additionalProperties":true},"monitorId":{"type":"string"},"region":{"type":"string"},"responseSummary":{"type":["string","null"]},"status":{"type":"string"},"statusCode":{"type":["integer","null"]}},"required":["checkedAt","errorMessage","id","latencyMs","metadata","monitorId","region","responseSummary","status","statusCode"]}},"serviceAttribution":{"type":"object","properties":{"confidence":{"type":"string","enum":["high","low","medium","none"]},"missingMetadata":{"type":"array","items":{"type":"string"}},"reasons":{"type":"array","items":{"type":"string"}},"service":{"type":["object","null"],"properties":{"dashboardUrl":{"type":["string","null"]},"id":{"type":["string","null"]},"name":{"type":["string","null"]},"ownerTeam":{"type":["object","null"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]},"runbookUrl":{"type":["string","null"]},"slug":{"type":"string"}},"required":["dashboardUrl","id","name","ownerTeam","runbookUrl","slug"]},"serviceName":{"type":["string","null"]},"sourceFields":{"type":"array","items":{"type":"string"}}},"required":["confidence","missingMetadata","reasons","service","serviceName","sourceFields"]}},"required":["evidence","events","incident","recentChecks","serviceAttribution"]}}}},"404":{"description":"Incident not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"incidents.update","summary":"Change an incident's severity, status, or assignee","description":"Change an incident's severity, status, or assignee","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assignedTo":{"type":["string","null"],"description":"A user ID, or null to clear it."},"severity":{"type":"string","description":"A severity level key of the project."},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"],"description":"Any move is allowed: forward, back, resolve, or reopen."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated incident","content":{"application/json":{"schema":{"type":"object","properties":{"postmortemUrl":{"type":["string","null"],"format":"uri"},"publicTitle":{"type":["string","null"]},"publicSummary":{"type":["string","null"]},"publishedAt":{"type":["string","null"],"format":"date-time"},"publishedToStatusPageId":{"type":["string","null"]},"acknowledgedAt":{"type":["string","null"],"format":"date-time"},"aiAssigned":{"type":"boolean"},"assignedTo":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"monitorId":{"type":["string","null"]},"monitorName":{"type":["string","null"]},"resolvedAt":{"type":["string","null"],"format":"date-time"},"responseSummary":{"type":["string","null"]},"rootCause":{"type":["string","null"]},"severity":{"type":"string"},"source":{"type":"object","description":"Where the incident came from: the monitor, alert connector, provider connection, or person. `kind` equals `sourceType`.","properties":{"declaredBy":{"type":["object","null"],"description":"The user who declared a manual incident.","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"externalId":{"type":["string","null"],"description":"The provider's alert, alarm, or issue ID that opened an integration incident."},"id":{"type":["string","null"],"description":"Monitor ID, finding ID, or the alert connector or provider connection ID."},"kind":{"type":"string","enum":["manual","monitor","heartbeat","integration","finding"]},"name":{"type":["string","null"],"description":"Monitor name, alert connector label, or provider account name."},"provider":{"type":["string","null"],"description":"Integration provider key, for example `datadog`, `aws_cloudwatch`, or `sentry`."},"url":{"type":["string","null"],"format":"uri","description":"Link back to the alert: its page in the provider, else the first page the sender linked. Null when none is known."}},"required":["declaredBy","externalId","id","kind","name","provider","url"]},"sourceType":{"type":"string"},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]},"suggestedControls":{"type":["string","null"]},"summary":{"type":["string","null"]},"suspectDeployment":{"type":["object","null"],"properties":{"deployedAt":{"type":"string","format":"date-time"},"gapSeconds":{"type":"integer"},"id":{"type":"string"},"service":{"type":["string","null"]},"version":{"type":["string","null"]}},"required":["deployedAt","gapSeconds","id","service","version"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["acknowledgedAt","aiAssigned","assignedTo","createdAt","id","monitorId","monitorName","resolvedAt","responseSummary","rootCause","severity","source","sourceType","status","suggestedControls","summary","suspectDeployment","title","updatedAt"]}}}},"404":{"description":"Incident not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Scheduled maintenance records change through maintenance windows","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"No field to change, unknown severity or status, or unknown user","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"},"delete":{"operationId":"incidents.delete","summary":"Delete an incident and its timeline","description":"Delete an incident and its timeline","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted incident","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"id":{"type":"string"}},"required":["deleted","id"]}}}},"404":{"description":"Incident not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/incidents/{incident_id}/comments":{"get":{"operationId":"incidents.listComments","summary":"List internal response comments for an incident","description":"List internal response comments for an incident","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Incident comments","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"author":{"type":"object","properties":{"email":{"type":["string","null"]},"id":{"type":"string"},"image":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["email","id","image","name"]},"body":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"incidentId":{"type":"string"},"mentionedUserIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["author","body","createdAt","id","incidentId","mentionedUserIds","updatedAt"]}}},"required":["data"]}}}},"404":{"description":"Incident not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"incidents.createComment","summary":"Create an internal response comment for an incident","description":"Create an internal response comment for an incident","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string"},"mentionedUserIds":{"type":"array","items":{"type":"string"}}},"required":["body"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created incident comment","content":{"application/json":{"schema":{"type":"object","properties":{"author":{"type":"object","properties":{"email":{"type":["string","null"]},"id":{"type":"string"},"image":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["email","id","image","name"]},"body":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"incidentId":{"type":"string"},"mentionedUserIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["author","body","createdAt","id","incidentId","mentionedUserIds","updatedAt"]}}}},"403":{"description":"A user actor is required to create comments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Incident not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid comment payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/incidents/{incident_id}/comments/{comment_id}":{"delete":{"operationId":"incidents.deleteComment","summary":"Delete one of the current actor's incident comments","description":"Delete one of the current actor's incident comments","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}},{"name":"comment_id","in":"path","required":true,"description":"Path parameter comment_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted incident comment","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"id":{"type":"string"}},"required":["deleted","id"]}}}},"403":{"description":"A user actor must own the comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Incident comment not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/incidents/{incident_id}/postmortem":{"patch":{"operationId":"incidents.updatePostmortem","summary":"Set or remove the public post-incident review link on a resolved published incident","description":"Set or remove the public post-incident review link on a resolved published incident","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"postmortemUrl":{"type":["string","null"],"format":"uri","maxLength":2048,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^/?#@\\\\]+(?:[/?#]|$)","description":"An HTTP or HTTPS URL without a username or password, or null to remove the link."}},"required":["postmortemUrl"],"additionalProperties":false}}}},"responses":{"200":{"description":"Saved post-incident review link","content":{"application/json":{"schema":{"type":"object","properties":{"postmortemUrl":{"type":["string","null"]}},"required":["postmortemUrl"]}}}},"404":{"description":"Incident not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Incident is not both resolved and published","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid review URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/incidents/{incident_id}/assignee":{"patch":{"operationId":"incidents.updateAssignee","summary":"Assign, reassign, or clear the responder assigned to an incident","description":"Assign, reassign, or clear the responder assigned to an incident","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assignedTo":{"type":["string","null"]}},"required":["assignedTo"],"additionalProperties":false}}}},"responses":{"200":{"description":"Updated incident","content":{"application/json":{"schema":{"type":"object","properties":{"postmortemUrl":{"type":["string","null"],"format":"uri"},"publicTitle":{"type":["string","null"]},"publicSummary":{"type":["string","null"]},"publishedAt":{"type":["string","null"],"format":"date-time"},"publishedToStatusPageId":{"type":["string","null"]},"acknowledgedAt":{"type":["string","null"],"format":"date-time"},"aiAssigned":{"type":"boolean"},"assignedTo":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"monitorId":{"type":["string","null"]},"monitorName":{"type":["string","null"]},"resolvedAt":{"type":["string","null"],"format":"date-time"},"responseSummary":{"type":["string","null"]},"rootCause":{"type":["string","null"]},"severity":{"type":"string"},"source":{"type":"object","description":"Where the incident came from: the monitor, alert connector, provider connection, or person. `kind` equals `sourceType`.","properties":{"declaredBy":{"type":["object","null"],"description":"The user who declared a manual incident.","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"externalId":{"type":["string","null"],"description":"The provider's alert, alarm, or issue ID that opened an integration incident."},"id":{"type":["string","null"],"description":"Monitor ID, finding ID, or the alert connector or provider connection ID."},"kind":{"type":"string","enum":["manual","monitor","heartbeat","integration","finding"]},"name":{"type":["string","null"],"description":"Monitor name, alert connector label, or provider account name."},"provider":{"type":["string","null"],"description":"Integration provider key, for example `datadog`, `aws_cloudwatch`, or `sentry`."},"url":{"type":["string","null"],"format":"uri","description":"Link back to the alert: its page in the provider, else the first page the sender linked. Null when none is known."}},"required":["declaredBy","externalId","id","kind","name","provider","url"]},"sourceType":{"type":"string"},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]},"suggestedControls":{"type":["string","null"]},"summary":{"type":["string","null"]},"suspectDeployment":{"type":["object","null"],"properties":{"deployedAt":{"type":"string","format":"date-time"},"gapSeconds":{"type":"integer"},"id":{"type":"string"},"service":{"type":["string","null"]},"version":{"type":["string","null"]}},"required":["deployedAt","gapSeconds","id","service","version"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["acknowledgedAt","aiAssigned","assignedTo","createdAt","id","monitorId","monitorName","resolvedAt","responseSummary","rootCause","severity","source","sourceType","status","suggestedControls","summary","suspectDeployment","title","updatedAt"]}}}},"404":{"description":"Incident not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Assignee is not a team member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/service-attribution/resolve":{"post":{"operationId":"incidents.resolveServiceAttribution","summary":"Resolve service ownership metadata from monitor, trace, alert, or runbook signals","description":"Resolve service ownership metadata from monitor, trace, alert, or runbook signals","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"alertFields":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"value":{"type":["string","null"]}},"required":["path","value"],"additionalProperties":false}},"explicitServiceName":{"type":["string","null"]},"monitorId":{"type":["string","null"]},"monitorName":{"type":["string","null"]},"repository":{"type":["string","null"]},"runbookUrl":{"type":["string","null"]},"statusComponentName":{"type":["string","null"]},"traceServiceName":{"type":["string","null"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Resolved service attribution","content":{"application/json":{"schema":{"type":"object","properties":{"confidence":{"type":"string","enum":["high","low","medium","none"]},"missingMetadata":{"type":"array","items":{"type":"string"}},"reasons":{"type":"array","items":{"type":"string"}},"service":{"type":["object","null"],"properties":{"dashboardUrl":{"type":["string","null"]},"id":{"type":["string","null"]},"name":{"type":["string","null"]},"ownerTeam":{"type":["object","null"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]},"runbookUrl":{"type":["string","null"]},"slug":{"type":"string"}},"required":["dashboardUrl","id","name","ownerTeam","runbookUrl","slug"]},"serviceName":{"type":["string","null"]},"sourceFields":{"type":"array","items":{"type":"string"}}},"required":["confidence","missingMetadata","reasons","service","serviceName","sourceFields"]}}}},"422":{"description":"Invalid service attribution payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/service-ownership/debt":{"get":{"operationId":"incidents.getServiceOwnershipDebt","summary":"List service ownership debt proven by operational services, monitors, and status components","description":"List service ownership debt proven by operational services, monitors, and status components","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Service ownership debt report","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Read-only service ownership debt report for missing owners, runbooks, monitor links, and status component links.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/service-ownership/import-candidates":{"get":{"operationId":"incidents.listServiceOwnershipImportCandidates","summary":"List unlinked monitors and status components grouped into operational service import candidates","description":"List unlinked monitors and status components grouped into operational service import candidates","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Operational service import candidates for the project","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"aliases":{"type":"array","items":{"type":"string"}},"existingServiceId":{"type":["string","null"]},"monitorIds":{"type":"array","items":{"type":"string"}},"sources":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string"},"linkedComponent":{"type":["string","null"]},"name":{"type":"string"},"statusPageId":{"type":"string"},"target":{"type":"string"},"type":{"type":"string","enum":["monitor","status_component"]}},"required":["id","name","type"]}},"statusComponentIds":{"type":"array","items":{"type":"string"}},"suggestedName":{"type":"string"},"suggestedSlug":{"type":"string"}},"required":["aliases","existingServiceId","monitorIds","sources","statusComponentIds","suggestedName","suggestedSlug"]}},"projectId":{"type":"string"}},"required":["data","projectId"]}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/service-ownership/import-candidates/{suggested_slug}/apply":{"post":{"operationId":"incidents.applyServiceOwnershipImportCandidate","summary":"Create or merge an operational service from a current service ownership import candidate","description":"Create or merge an operational service from a current service ownership import candidate","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"suggested_slug","in":"path","required":true,"description":"Suggested service slug returned by the import candidates endpoint","schema":{"type":"string"}}],"responses":{"200":{"description":"Existing or merged operational service","content":{"application/json":{"schema":{"type":"object","properties":{"aliases":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"dashboardUrl":{"type":["string","null"]},"dependencyServiceIds":{"type":"array","items":{"type":"string"}},"description":{"type":["string","null"]},"id":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"ownerTeam":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]},{"type":"null"}]},"projectId":{"type":"string"},"repositories":{"type":"array","items":{"type":"string"}},"runbookUrl":{"type":["string","null"]},"slug":{"type":"string"},"statusComponentIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["aliases","createdAt","dashboardUrl","dependencyServiceIds","description","id","monitorIds","name","ownerTeam","projectId","repositories","runbookUrl","slug","statusComponentIds","updatedAt"]}}}},"201":{"description":"Created operational service from the import candidate","content":{"application/json":{"schema":{"type":"object","properties":{"aliases":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"dashboardUrl":{"type":["string","null"]},"dependencyServiceIds":{"type":"array","items":{"type":"string"}},"description":{"type":["string","null"]},"id":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"ownerTeam":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]},{"type":"null"}]},"projectId":{"type":"string"},"repositories":{"type":"array","items":{"type":"string"}},"runbookUrl":{"type":["string","null"]},"slug":{"type":"string"},"statusComponentIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["aliases","createdAt","dashboardUrl","dependencyServiceIds","description","id","monitorIds","name","ownerTeam","projectId","repositories","runbookUrl","slug","statusComponentIds","updatedAt"]}}}},"404":{"description":"Import candidate not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"One or more candidate sources are already assigned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid import candidate slug","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/service-ownership/teams":{"get":{"operationId":"incidents.listServiceOwnershipTeams","summary":"List operational owner teams available for incident ownership","description":"List operational owner teams available for incident ownership","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Operational owner teams for the project","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"description":{"type":["string","null"]},"id":{"type":"string"},"name":{"type":"string"},"projectId":{"type":"string"},"slug":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","description","id","name","projectId","slug","updatedAt"]}},"projectId":{"type":"string"}},"required":["data","projectId"]}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"incidents.createServiceOwnershipTeam","summary":"Create an operational owner team for incident ownership","description":"Create an operational owner team for incident ownership","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":["string","null"]},"name":{"type":"string"},"slug":{"type":"string"}},"required":["name","slug"],"additionalProperties":false}}}},"responses":{"200":{"description":"Existing operational owner team for the requested slug","content":{"application/json":{"schema":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"description":{"type":["string","null"]},"id":{"type":"string"},"name":{"type":"string"},"projectId":{"type":"string"},"slug":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","description","id","name","projectId","slug","updatedAt"]}}}},"201":{"description":"Created operational owner team","content":{"application/json":{"schema":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"description":{"type":["string","null"]},"id":{"type":"string"},"name":{"type":"string"},"projectId":{"type":"string"},"slug":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","description","id","name","projectId","slug","updatedAt"]}}}},"409":{"description":"Team slug already exists","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid team payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/service-ownership/teams/{team_id}":{"patch":{"operationId":"incidents.updateServiceOwnershipTeam","summary":"Update operational owner team metadata for incident ownership","description":"Update operational owner team metadata for incident ownership","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"team_id","in":"path","required":true,"description":"Path parameter team_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":["string","null"]},"name":{"type":"string"},"slug":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated operational owner team","content":{"application/json":{"schema":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"description":{"type":["string","null"]},"id":{"type":"string"},"name":{"type":"string"},"projectId":{"type":"string"},"slug":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","description","id","name","projectId","slug","updatedAt"]}}}},"404":{"description":"Team not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Team slug already exists","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid team payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"incidents.deleteServiceOwnershipTeam","summary":"Delete an operational owner team and clear service owner references","description":"Delete an operational owner team and clear service owner references","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"team_id","in":"path","required":true,"description":"Path parameter team_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted operational owner team","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]}}}},"404":{"description":"Team not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/service-ownership/services":{"get":{"operationId":"incidents.listServiceOwnershipServices","summary":"List operational services and ownership links for a project","description":"List operational services and ownership links for a project","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Operational services for the project","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"aliases":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"dashboardUrl":{"type":["string","null"]},"dependencyServiceIds":{"type":"array","items":{"type":"string"}},"description":{"type":["string","null"]},"id":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"ownerTeam":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]},{"type":"null"}]},"projectId":{"type":"string"},"repositories":{"type":"array","items":{"type":"string"}},"runbookUrl":{"type":["string","null"]},"slug":{"type":"string"},"statusComponentIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["aliases","createdAt","dashboardUrl","dependencyServiceIds","description","id","monitorIds","name","ownerTeam","projectId","repositories","runbookUrl","slug","statusComponentIds","updatedAt"]}},"projectId":{"type":"string"}},"required":["data","projectId"]}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"incidents.createServiceOwnershipService","summary":"Create an operational service for incident ownership","description":"Create an operational service for incident ownership","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"dashboardUrl":{"type":["string","null"],"format":"uri"},"description":{"type":["string","null"]},"name":{"type":"string"},"ownerTeamId":{"type":["string","null"]},"runbookUrl":{"type":["string","null"],"format":"uri"},"slug":{"type":"string"}},"required":["name","slug"],"additionalProperties":false}}}},"responses":{"200":{"description":"Existing operational service for the requested slug","content":{"application/json":{"schema":{"type":"object","properties":{"aliases":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"dashboardUrl":{"type":["string","null"]},"dependencyServiceIds":{"type":"array","items":{"type":"string"}},"description":{"type":["string","null"]},"id":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"ownerTeam":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]},{"type":"null"}]},"projectId":{"type":"string"},"repositories":{"type":"array","items":{"type":"string"}},"runbookUrl":{"type":["string","null"]},"slug":{"type":"string"},"statusComponentIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["aliases","createdAt","dashboardUrl","dependencyServiceIds","description","id","monitorIds","name","ownerTeam","projectId","repositories","runbookUrl","slug","statusComponentIds","updatedAt"]}}}},"201":{"description":"Created operational service","content":{"application/json":{"schema":{"type":"object","properties":{"aliases":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"dashboardUrl":{"type":["string","null"]},"dependencyServiceIds":{"type":"array","items":{"type":"string"}},"description":{"type":["string","null"]},"id":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"ownerTeam":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]},{"type":"null"}]},"projectId":{"type":"string"},"repositories":{"type":"array","items":{"type":"string"}},"runbookUrl":{"type":["string","null"]},"slug":{"type":"string"},"statusComponentIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["aliases","createdAt","dashboardUrl","dependencyServiceIds","description","id","monitorIds","name","ownerTeam","projectId","repositories","runbookUrl","slug","statusComponentIds","updatedAt"]}}}},"400":{"description":"Invalid owner team reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Service slug already exists","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid service payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/service-ownership/services/{service_id}":{"patch":{"operationId":"incidents.updateServiceOwnershipService","summary":"Update operational service metadata for incident ownership","description":"Update operational service metadata for incident ownership","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"service_id","in":"path","required":true,"description":"Path parameter service_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"dashboardUrl":{"type":["string","null"],"format":"uri"},"description":{"type":["string","null"]},"name":{"type":"string"},"ownerTeamId":{"type":["string","null"]},"runbookUrl":{"type":["string","null"],"format":"uri"},"slug":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated operational service","content":{"application/json":{"schema":{"type":"object","properties":{"aliases":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"dashboardUrl":{"type":["string","null"]},"dependencyServiceIds":{"type":"array","items":{"type":"string"}},"description":{"type":["string","null"]},"id":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"ownerTeam":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]},{"type":"null"}]},"projectId":{"type":"string"},"repositories":{"type":"array","items":{"type":"string"}},"runbookUrl":{"type":["string","null"]},"slug":{"type":"string"},"statusComponentIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["aliases","createdAt","dashboardUrl","dependencyServiceIds","description","id","monitorIds","name","ownerTeam","projectId","repositories","runbookUrl","slug","statusComponentIds","updatedAt"]}}}},"400":{"description":"Invalid owner team reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Service not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Service slug already exists","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid service payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"incidents.deleteServiceOwnershipService","summary":"Delete an operational service and its ownership links","description":"Delete an operational service and its ownership links","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"service_id","in":"path","required":true,"description":"Path parameter service_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted operational service","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]}}}},"404":{"description":"Service not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/service-ownership/services/{service_id}/links":{"put":{"operationId":"incidents.updateServiceOwnershipServiceLinks","summary":"Replace operational service aliases, repositories, monitor links, status component links, and service dependencies","description":"Replace operational service aliases, repositories, monitor links, status component links, and service dependencies","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"service_id","in":"path","required":true,"description":"Path parameter service_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"aliases":{"type":"array","items":{"type":"string"}},"dependencyServiceIds":{"type":"array","items":{"type":"string"}},"monitorIds":{"type":"array","items":{"type":"string"}},"repositories":{"type":"array","items":{"type":"string"}},"statusComponentIds":{"type":"array","items":{"type":"string"}}},"required":["aliases","dependencyServiceIds","monitorIds","repositories","statusComponentIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Updated operational service with replaced links","content":{"application/json":{"schema":{"type":"object","properties":{"aliases":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"dashboardUrl":{"type":["string","null"]},"dependencyServiceIds":{"type":"array","items":{"type":"string"}},"description":{"type":["string","null"]},"id":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"ownerTeam":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"]},{"type":"null"}]},"projectId":{"type":"string"},"repositories":{"type":"array","items":{"type":"string"}},"runbookUrl":{"type":["string","null"]},"slug":{"type":"string"},"statusComponentIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time"}},"required":["aliases","createdAt","dashboardUrl","dependencyServiceIds","description","id","monitorIds","name","ownerTeam","projectId","repositories","runbookUrl","slug","statusComponentIds","updatedAt"]}}}},"404":{"description":"Service or linked resources not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"One or more links are already assigned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid service links payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/incidents/{incident_id}/ack":{"post":{"operationId":"incidents.ack","summary":"Acknowledge an incident and append an acknowledged timeline event","description":"Acknowledge an incident and append an acknowledged timeline event","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Acknowledged incident","content":{"application/json":{"schema":{"type":"object","properties":{"postmortemUrl":{"type":["string","null"],"format":"uri"},"publicTitle":{"type":["string","null"]},"publicSummary":{"type":["string","null"]},"publishedAt":{"type":["string","null"],"format":"date-time"},"publishedToStatusPageId":{"type":["string","null"]},"acknowledgedAt":{"type":["string","null"],"format":"date-time"},"aiAssigned":{"type":"boolean"},"assignedTo":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"monitorId":{"type":["string","null"]},"monitorName":{"type":["string","null"]},"resolvedAt":{"type":["string","null"],"format":"date-time"},"responseSummary":{"type":["string","null"]},"rootCause":{"type":["string","null"]},"severity":{"type":"string"},"source":{"type":"object","description":"Where the incident came from: the monitor, alert connector, provider connection, or person. `kind` equals `sourceType`.","properties":{"declaredBy":{"type":["object","null"],"description":"The user who declared a manual incident.","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"externalId":{"type":["string","null"],"description":"The provider's alert, alarm, or issue ID that opened an integration incident."},"id":{"type":["string","null"],"description":"Monitor ID, finding ID, or the alert connector or provider connection ID."},"kind":{"type":"string","enum":["manual","monitor","heartbeat","integration","finding"]},"name":{"type":["string","null"],"description":"Monitor name, alert connector label, or provider account name."},"provider":{"type":["string","null"],"description":"Integration provider key, for example `datadog`, `aws_cloudwatch`, or `sentry`."},"url":{"type":["string","null"],"format":"uri","description":"Link back to the alert: its page in the provider, else the first page the sender linked. Null when none is known."}},"required":["declaredBy","externalId","id","kind","name","provider","url"]},"sourceType":{"type":"string"},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]},"suggestedControls":{"type":["string","null"]},"summary":{"type":["string","null"]},"suspectDeployment":{"type":["object","null"],"properties":{"deployedAt":{"type":"string","format":"date-time"},"gapSeconds":{"type":"integer"},"id":{"type":"string"},"service":{"type":["string","null"]},"version":{"type":["string","null"]}},"required":["deployedAt","gapSeconds","id","service","version"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["acknowledgedAt","aiAssigned","assignedTo","createdAt","id","monitorId","monitorName","resolvedAt","responseSummary","rootCause","severity","source","sourceType","status","suggestedControls","summary","suspectDeployment","title","updatedAt"]}}}},"404":{"description":"Incident not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/incidents/{incident_id}/resolve":{"post":{"operationId":"incidents.resolve","summary":"Resolve an incident and append a resolved timeline event","description":"Resolve an incident and append a resolved timeline event","tags":["incidents"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"path","required":true,"description":"Path parameter incident_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Resolved incident","content":{"application/json":{"schema":{"type":"object","properties":{"postmortemUrl":{"type":["string","null"],"format":"uri"},"publicTitle":{"type":["string","null"]},"publicSummary":{"type":["string","null"]},"publishedAt":{"type":["string","null"],"format":"date-time"},"publishedToStatusPageId":{"type":["string","null"]},"acknowledgedAt":{"type":["string","null"],"format":"date-time"},"aiAssigned":{"type":"boolean"},"assignedTo":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"monitorId":{"type":["string","null"]},"monitorName":{"type":["string","null"]},"resolvedAt":{"type":["string","null"],"format":"date-time"},"responseSummary":{"type":["string","null"]},"rootCause":{"type":["string","null"]},"severity":{"type":"string"},"source":{"type":"object","description":"Where the incident came from: the monitor, alert connector, provider connection, or person. `kind` equals `sourceType`.","properties":{"declaredBy":{"type":["object","null"],"description":"The user who declared a manual incident.","properties":{"id":{"type":"string"},"name":{"type":["string","null"]}},"required":["id","name"]},"externalId":{"type":["string","null"],"description":"The provider's alert, alarm, or issue ID that opened an integration incident."},"id":{"type":["string","null"],"description":"Monitor ID, finding ID, or the alert connector or provider connection ID."},"kind":{"type":"string","enum":["manual","monitor","heartbeat","integration","finding"]},"name":{"type":["string","null"],"description":"Monitor name, alert connector label, or provider account name."},"provider":{"type":["string","null"],"description":"Integration provider key, for example `datadog`, `aws_cloudwatch`, or `sentry`."},"url":{"type":["string","null"],"format":"uri","description":"Link back to the alert: its page in the provider, else the first page the sender linked. Null when none is known."}},"required":["declaredBy","externalId","id","kind","name","provider","url"]},"sourceType":{"type":"string"},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]},"suggestedControls":{"type":["string","null"]},"summary":{"type":["string","null"]},"suspectDeployment":{"type":["object","null"],"properties":{"deployedAt":{"type":"string","format":"date-time"},"gapSeconds":{"type":"integer"},"id":{"type":"string"},"service":{"type":["string","null"]},"version":{"type":["string","null"]}},"required":["deployedAt","gapSeconds","id","service","version"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["acknowledgedAt","aiAssigned","assignedTo","createdAt","id","monitorId","monitorName","resolvedAt","responseSummary","rootCause","severity","source","sourceType","status","suggestedControls","summary","suspectDeployment","title","updatedAt"]}}}},"404":{"description":"Incident not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/incident-severity-levels":{"get":{"operationId":"incidentSeverity.list","summary":"List the project's incident severity levels and naming style","description":"List the project's incident severity levels and naming style","tags":["incidentSeverity"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Severity levels","content":{"application/json":{"schema":{"type":"object","properties":{"levels":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","description":"Stable key, for example `sev-1`."},"label":{"type":"string","description":"`SEV-1` or `P1`, from the naming style."},"rank":{"type":"integer","description":"1 is the most severe."},"tone":{"type":"string","enum":["destructive","amber","sky","violet","emerald","muted"]}},"required":["key","label","rank","tone"]}},"namingStyle":{"type":"string","enum":["sev","p"]}},"required":["levels","namingStyle"]}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"incidentSeverity.add","summary":"Add the next, least severe level","description":"Add the next, least severe level","tags":["incidentSeverity"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"201":{"description":"Added severity level","content":{"application/json":{"schema":{"type":"object","properties":{"level":{"type":"object","properties":{"key":{"type":"string","description":"Stable key, for example `sev-1`."},"label":{"type":"string","description":"`SEV-1` or `P1`, from the naming style."},"rank":{"type":"integer","description":"1 is the most severe."},"tone":{"type":"string","enum":["destructive","amber","sky","violet","emerald","muted"]}},"required":["key","label","rank","tone"]}},"required":["level"]}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/incident-severity-levels/naming-style":{"put":{"operationId":"incidentSeverity.setNamingStyle","summary":"Name the levels SEV-1, SEV-2 (`sev`) or P1, P2 (`p`)","description":"Name the levels SEV-1, SEV-2 (`sev`) or P1, P2 (`p`)","tags":["incidentSeverity"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"style":{"type":"string","enum":["sev","p"]}},"required":["style"],"additionalProperties":false}}}},"responses":{"200":{"description":"Renamed severity levels","content":{"application/json":{"schema":{"type":"object","properties":{"levels":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","description":"Stable key, for example `sev-1`."},"label":{"type":"string","description":"`SEV-1` or `P1`, from the naming style."},"rank":{"type":"integer","description":"1 is the most severe."},"tone":{"type":"string","enum":["destructive","amber","sky","violet","emerald","muted"]}},"required":["key","label","rank","tone"]}},"namingStyle":{"type":"string","enum":["sev","p"]}},"required":["levels","namingStyle"]}}}},"422":{"description":"Naming style must be `sev` or `p`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/incident-severity-levels/{key}":{"delete":{"operationId":"incidentSeverity.remove","summary":"Remove a severity level; at least one level stays","description":"Remove a severity level; at least one level stays","tags":["incidentSeverity"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"key","in":"path","required":true,"description":"Path parameter key","schema":{"type":"string"}}],"responses":{"200":{"description":"Removed severity level","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]}}}},"422":{"description":"The last severity level cannot be removed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/maintenance-windows":{"get":{"operationId":"maintenanceWindows.list","summary":"List the project's scheduled, active, and completed maintenance windows","description":"List the project's scheduled, active, and completed maintenance windows","tags":["maintenanceWindows"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Maintenance windows","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"message":{"type":"string"},"projectId":{"type":"string"},"startsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","active","completed"]},"statusPageId":{"type":["string","null"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","endsAt","id","message","projectId","startsAt","status","statusPageId","title","updatedAt"]}}},"required":["data"]}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"maintenanceWindows.create","summary":"Schedule a maintenance window; omitted times default to now and status to scheduled","description":"Schedule a maintenance window; omitted times default to now and status to scheduled","tags":["maintenanceWindows"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"endsAt":{"type":"string","format":"date-time"},"message":{"type":"string","description":"The notice that the status page shows."},"startsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","active","completed"]},"statusPageId":{"type":["string","null"],"format":"uuid","description":"The status page that shows the window, or null to show it on no page."},"title":{"type":"string"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Scheduled maintenance window","content":{"application/json":{"schema":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"message":{"type":"string"},"projectId":{"type":"string"},"startsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","active","completed"]},"statusPageId":{"type":["string","null"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","endsAt","id","message","projectId","startsAt","status","statusPageId","title","updatedAt"]}}}},"403":{"description":"The plan does not include maintenance windows","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid payload or status page not in this project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/maintenance-windows/{maintenance_id}":{"get":{"operationId":"maintenanceWindows.get","summary":"Get one maintenance window","description":"Get one maintenance window","tags":["maintenanceWindows"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"maintenance_id","in":"path","required":true,"description":"Path parameter maintenance_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Maintenance window","content":{"application/json":{"schema":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"message":{"type":"string"},"projectId":{"type":"string"},"startsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","active","completed"]},"statusPageId":{"type":["string","null"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","endsAt","id","message","projectId","startsAt","status","statusPageId","title","updatedAt"]}}}},"404":{"description":"Maintenance window not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"maintenanceWindows.update","summary":"Change a maintenance window; omitted fields keep their saved values","description":"Change a maintenance window; omitted fields keep their saved values","tags":["maintenanceWindows"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"maintenance_id","in":"path","required":true,"description":"Path parameter maintenance_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"endsAt":{"type":"string","format":"date-time"},"message":{"type":"string","description":"The notice that the status page shows."},"startsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","active","completed"]},"statusPageId":{"type":["string","null"],"format":"uuid","description":"The status page that shows the window, or null to show it on no page."},"title":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated maintenance window","content":{"application/json":{"schema":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"id":{"type":"string"},"message":{"type":"string"},"projectId":{"type":"string"},"startsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["scheduled","active","completed"]},"statusPageId":{"type":["string","null"]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}},"required":["createdAt","endsAt","id","message","projectId","startsAt","status","statusPageId","title","updatedAt"]}}}},"403":{"description":"The plan does not include maintenance windows","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Maintenance window not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid payload or status page not in this project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"maintenanceWindows.delete","summary":"Delete a maintenance window","description":"Delete a maintenance window","tags":["maintenanceWindows"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"maintenance_id","in":"path","required":true,"description":"Path parameter maintenance_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted maintenance window","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"id":{"type":"string"}},"required":["deleted","id"]}}}},"404":{"description":"Maintenance window not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/query-guide":{"get":{"operationId":"queryGuide.get","summary":"Describe the agent-optimized query surfaces for a project","description":"Describe the agent-optimized query surfaces for a project","tags":["queryGuide"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/observability-summary":{"get":{"operationId":"observabilitySummary.get","summary":"Get a compact operator-focused summary of the most relevant logs and latency metrics for a project or service","description":"Get a compact operator-focused summary of the most relevant logs and latency metrics for a project or service","tags":["observabilitySummary"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/github/activity":{"get":{"operationId":"providerCapabilities.githubActivity","summary":"Fetch recent GitHub commits and pull requests for the linked project repo","description":"Fetch recent GitHub commits and pull requests for the linked project repo","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"GitHub activity","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"total":{"type":"integer"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/sentry/selection-projects":{"post":{"operationId":"providerCapabilities.sentrySelectionProjects","summary":"List projects from a short-lived Sentry OAuth selection session","description":"List projects from a short-lived Sentry OAuth selection session","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"selection_token":{"minLength":1,"type":"string"}},"required":["selection_token"],"type":"object"}}}},"responses":{"200":{"description":"Sentry projects available to the authorized installation","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"projects":{"items":{"additionalProperties":false,"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"],"type":"object"},"type":"array"}},"required":["projects"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/sentry/select-project":{"post":{"operationId":"providerCapabilities.sentrySelectProject","summary":"Complete a Sentry OAuth selection session with one server-listed project","description":"Complete a Sentry OAuth selection session with one server-listed project","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"selection_token":{"minLength":1,"type":"string"},"sentry_project_slug":{"minLength":1,"type":"string"}},"required":["selection_token","sentry_project_slug"],"type":"object"}}}},"responses":{"200":{"description":"Connected Sentry project","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"project":{"additionalProperties":false,"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["id","name","slug"],"type":"object"},"status":{"enum":["connected"],"type":"string"}},"required":["project","status"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/providers/sentry/issues":{"get":{"operationId":"providerCapabilities.sentryIssues","summary":"List Sentry issues for the project-bound Sentry project","description":"List Sentry issues for the project-bound Sentry project","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum issues to return (1-50).","schema":{"maximum":50,"minimum":1,"type":"integer"}},{"name":"query","in":"query","required":false,"description":"Sentry issue-search query. Defaults to is:unresolved.","schema":{"maxLength":500,"type":"string"}}],"responses":{"200":{"description":"Sentry issues","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"issues":{"items":{"additionalProperties":false,"properties":{"count":{"type":"integer"},"culprit":{"type":["string","null"]},"firstSeen":{"type":["string","null"]},"id":{"type":"string"},"lastSeen":{"type":["string","null"]},"level":{"type":["string","null"]},"permalink":{"type":["string","null"]},"status":{"type":"string"},"title":{"type":"string"}},"required":["count","id","status","title"],"type":"object"},"type":"array"}},"required":["issues"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/sentry/issues/{issue_id}/latest-event":{"get":{"operationId":"providerCapabilities.sentryLatestEvent","summary":"Read the latest event for one Sentry issue","description":"Read the latest event for one Sentry issue","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"issue_id","in":"path","required":true,"description":"Path parameter issue_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Latest Sentry issue event","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"contexts":{"additionalProperties":true,"type":"object"},"entries":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"eventId":{"type":"string"},"message":{"type":"string"},"platform":{"type":["string","null"]},"tags":{"items":{"additionalProperties":false,"properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"],"type":"object"},"type":"array"}},"required":["contexts","entries","eventId","message","platform","tags"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/github/ci-failures":{"get":{"operationId":"providerCapabilities.githubCiFailures","summary":"Fetch recent Squasher-ingested GitHub CI failure groups for the project","description":"Fetch recent Squasher-ingested GitHub CI failure groups for the project","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"GitHub CI failure groups","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"failures":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"branch":{"type":["string","null"]},"checkName":{"type":["string","null"]},"conclusion":{"type":"string"},"errorGroupId":{"type":"string"},"event":{"type":"string"},"eventCount":{"type":"integer"},"evidenceRefs":{"type":"array","items":{"type":"object","additionalProperties":true}},"failureId":{"type":"string"},"firstSeen":{"type":"string","format":"date-time"},"lastSeen":{"type":"string","format":"date-time"},"repo":{"type":"string"},"runId":{"type":"string"},"runUrl":{"type":["string","null"]},"summary":{"type":"string"},"workflowName":{"type":["string","null"]}}}},"generatedAt":{"type":"string","format":"date-time"},"limit":{"type":"integer"},"total":{"type":"integer"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/linear/issues":{"get":{"operationId":"providerCapabilities.linearIssues","summary":"Fetch recent Linear issues for the project's configured Linear team","description":"Fetch recent Linear issues for the project's configured Linear team","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Linear issues","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"total":{"type":"integer"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/notion/connect":{"post":{"operationId":"providerCapabilities.notionConnect","summary":"Start the Notion page-picker OAuth flow for this project","description":"Start the Notion page-picker OAuth flow for this project","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Provider authorization URL","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","format":"uri"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/providers/notion/connection":{"delete":{"operationId":"providerCapabilities.notionDisconnect","summary":"Revoke and remove the project's Notion connection","description":"Revoke and remove the project's Notion connection","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/providers/notion/resources":{"get":{"operationId":"providerCapabilities.notionSearch","summary":"Search pages and data sources shared through the project's Notion connection","description":"Search pages and data sources shared through the project's Notion connection","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Opaque Notion cursor from the previous response.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Results to return. Squasher limits this to 100.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"query","in":"query","required":false,"description":"Optional title text.","schema":{"type":"string","maxLength":200}},{"name":"kind","in":"query","required":false,"description":"Limit results by resource type.","schema":{"type":"string","enum":["data_source","page"]}}],"responses":{"200":{"description":"Shared Notion resources","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":["string","null"]},"rows":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["data_source","page"]},"lastEditedTime":{"type":["string","null"]},"title":{"type":"string"},"url":{"type":["string","null"]}}}}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/notion/pages/{page_id}":{"get":{"operationId":"providerCapabilities.notionPage","summary":"Get metadata for one page shared with the project's Notion connection","description":"Get metadata for one page shared with the project's Notion connection","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"page_id","in":"path","required":true,"description":"Path parameter page_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Notion page","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["data_source","page"]},"lastEditedTime":{"type":["string","null"]},"title":{"type":"string"},"url":{"type":["string","null"]}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/notion/pages/{page_id}/blocks":{"get":{"operationId":"providerCapabilities.notionPageBlocks","summary":"Read bounded, recursive block content for a shared Notion page","description":"Read bounded, recursive block content for a shared Notion page","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"page_id","in":"path","required":true,"description":"Path parameter page_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Bounded Notion page blocks","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"blocks":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"depth":{"type":"integer"},"hasChildren":{"type":"boolean"},"id":{"type":"string"},"text":{"type":"string"},"type":{"type":"string"}}}},"truncated":{"type":"boolean"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/notion/data-sources/{data_source_id}":{"get":{"operationId":"providerCapabilities.notionDataSource","summary":"Get the current schema for a Notion data source","description":"Get the current schema for a Notion data source","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"data_source_id","in":"path","required":true,"description":"Path parameter data_source_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Notion data-source schema","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"properties":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string"},"type":{"type":"string"}}}},"title":{"type":"string"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/notion/data-sources/{data_source_id}/pages":{"get":{"operationId":"providerCapabilities.notionDataSourceQuery","summary":"Query pages in a Notion data source with bounded pagination","description":"Query pages in a Notion data source with bounded pagination","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"data_source_id","in":"path","required":true,"description":"Path parameter data_source_id","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Opaque Notion cursor from the previous response.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Results to return. Squasher limits this to 100.","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Notion data-source pages","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":["string","null"]},"rows":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["data_source","page"]},"lastEditedTime":{"type":["string","null"]},"title":{"type":"string"},"url":{"type":["string","null"]}}}}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/railway/deployments":{"get":{"operationId":"providerCapabilities.railwayDeployments","summary":"List Railway deployments for the bound Railway project service","description":"List Railway deployments for the bound Railway project service","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Railway deployments","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"total":{"type":"integer"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/railway/logs":{"get":{"operationId":"providerCapabilities.railwayLogs","summary":"Search logs for the latest Railway deployment on the bound project service","description":"Search logs for the latest Railway deployment on the bound project service","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Railway logs","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"total":{"type":"integer"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/railway/restart":{"post":{"operationId":"providerCapabilities.railwayRestart","summary":"Restart the latest Railway deployment for the bound project service","description":"Restart the latest Railway deployment for the bound project service","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"environment":{"type":"string","description":"Railway environment name or id."},"service":{"type":"string","description":"Railway service name or id."}}}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/providers/railway/redeploy":{"post":{"operationId":"providerCapabilities.railwayRedeploy","summary":"Redeploy the latest Railway deployment for the bound project service","description":"Redeploy the latest Railway deployment for the bound project service","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"environment":{"type":"string","description":"Railway environment name or id."},"service":{"type":"string","description":"Railway service name or id."}}}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/providers/vercel/deployments":{"get":{"operationId":"providerCapabilities.vercelDeployments","summary":"List Vercel deployments for the bound Vercel project","description":"List Vercel deployments for the bound Vercel project","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Vercel deployments","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"total":{"type":"integer"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/vercel/deployment":{"get":{"operationId":"providerCapabilities.vercelDeployment","summary":"Get details for a Vercel deployment in the bound project","description":"Get details for a Vercel deployment in the bound project","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Vercel deployment details"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/vercel/deployment-logs":{"get":{"operationId":"providerCapabilities.vercelDeploymentLogs","summary":"Search build and deployment logs for a Vercel deployment","description":"Search build and deployment logs for a Vercel deployment","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Vercel deployment logs","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"total":{"type":"integer"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/providers/vercel/runtime-logs":{"get":{"operationId":"providerCapabilities.vercelRuntimeLogs","summary":"Search Vercel runtime logs for a deployment in the bound project","description":"Search Vercel runtime logs for a deployment in the bound project","tags":["providerCapabilities"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Vercel runtime logs","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"total":{"type":"integer"}}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/agent-observations":{"get":{"operationId":"agentObservations.list","summary":"List agent observations for a project with filtering and pagination","description":"List agent observations for a project with filtering and pagination","tags":["agentObservations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/agent-observations/export":{"get":{"operationId":"agentObservations.export","summary":"Export bounded, score-aware AI generation examples for evaluation or model training","description":"Export bounded, score-aware AI generation examples for evaluation or model training","tags":["agentObservations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Query parameter from","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Query parameter to","schema":{"type":"string","format":"date-time"}},{"name":"q","in":"query","required":false,"description":"Query parameter q","schema":{"type":"string"}},{"name":"model","in":"query","required":false,"description":"Query parameter model","schema":{"type":"string"}},{"name":"provider","in":"query","required":false,"description":"Query parameter provider","schema":{"type":"string"}},{"name":"release","in":"query","required":false,"description":"Query parameter release","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Query parameter status","schema":{"type":"string"}},{"name":"score_name","in":"query","required":false,"description":"Query parameter score_name","schema":{"type":"string"}},{"name":"score_source","in":"query","required":false,"description":"Query parameter score_source","schema":{"type":"string","enum":["api","eval","annotation"]}},{"name":"score_label","in":"query","required":false,"description":"Query parameter score_label","schema":{"type":"string"}},{"name":"min_score","in":"query","required":false,"description":"Query parameter min_score","schema":{"type":"number"}},{"name":"max_score","in":"query","required":false,"description":"Query parameter max_score","schema":{"type":"number"}},{"name":"include_identifiers","in":"query","required":false,"description":"Query parameter include_identifiers","schema":{"type":"boolean"}},{"name":"include_metadata","in":"query","required":false,"description":"Query parameter include_metadata","schema":{"type":"boolean"}},{"name":"require_output","in":"query","required":false,"description":"Query parameter require_output","schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Query parameter offset","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"read"}},"/v1/projects/{project_id}/agent-observations/quality":{"get":{"operationId":"agentObservations.quality","summary":"Measure telemetry completeness and metadata-only privacy posture without returning captured content","description":"Measure telemetry completeness and metadata-only privacy posture without returning captured content","tags":["agentObservations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Window start; defaults to 24 hours before `to`","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Window end; defaults to now. Windows are capped at 31 days","schema":{"type":"string","format":"date-time"}},{"name":"model","in":"query","required":false,"description":"Query parameter model","schema":{"type":"string"}},{"name":"provider","in":"query","required":false,"description":"Query parameter provider","schema":{"type":"string"}},{"name":"release","in":"query","required":false,"description":"Query parameter release","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"agent_id","in":"query","required":false,"description":"Query parameter agent_id","schema":{"type":"string"}},{"name":"workflow_id","in":"query","required":false,"description":"Query parameter workflow_id","schema":{"type":"string"}},{"name":"include_missing_examples","in":"query","required":false,"description":"Include up to 20 observation IDs missing each telemetry field","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/agent-observations/{observation_id}":{"get":{"operationId":"agentObservations.get","summary":"Get a single agent observation by ID","description":"Get a single agent observation by ID","tags":["agentObservations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"observation_id","in":"path","required":true,"description":"Path parameter observation_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/agent-scores":{"get":{"operationId":"agentScores.list","summary":"List quality scores recorded against traces and generations, with filtering and pagination","description":"List quality scores recorded against traces and generations, with filtering and pagination","tags":["agentScores"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/agent-scores/summary":{"get":{"operationId":"agentScores.summary","summary":"Aggregate recorded scores by name — count, average, min and max","description":"Aggregate recorded scores by name — count, average, min and max","tags":["agentScores"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/agent-traces":{"get":{"operationId":"agentTraces.list","summary":"List agent traces for a project with per-trace span, error, token, and cost roll-ups","description":"List agent traces for a project with per-trace span, error, token, and cost roll-ups","tags":["agentTraces"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Query parameter from","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Query parameter to","schema":{"type":"string","format":"date-time"}},{"name":"q","in":"query","required":false,"description":"Query parameter q","schema":{"type":"string"}},{"name":"model","in":"query","required":false,"description":"Query parameter model","schema":{"type":"string"}},{"name":"provider","in":"query","required":false,"description":"Query parameter provider","schema":{"type":"string"}},{"name":"session_id","in":"query","required":false,"description":"Query parameter session_id","schema":{"type":"string"}},{"name":"user_id","in":"query","required":false,"description":"Query parameter user_id","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Query parameter status","schema":{"type":"string"}},{"name":"tool_name","in":"query","required":false,"description":"Query parameter tool_name","schema":{"type":"string"}},{"name":"observation_type","in":"query","required":false,"description":"Query parameter observation_type","schema":{"type":"string"}},{"name":"agent_id","in":"query","required":false,"description":"Query parameter agent_id","schema":{"type":"string"}},{"name":"workflow_id","in":"query","required":false,"description":"Query parameter workflow_id","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Query parameter offset","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/alert-connectors/catalog":{"get":{"operationId":"alertConnectors.catalog","summary":"List supported inbound alert providers","description":"List supported inbound alert providers","tags":["alertConnectors"],"parameters":[],"responses":{"200":{"description":"Supported inbound alert connector providers","content":{"application/json":{"schema":{"items":{"additionalProperties":false,"properties":{"auth_methods":{"items":{"enum":["bearer","routing_key","sns_signature"],"type":"string"},"type":"array"},"capabilities":{"items":{"enum":["acknowledge","batch","resolve","test"],"type":"string"},"type":"array"},"config_fields":{"items":{"additionalProperties":false,"properties":{"control":{"enum":["boolean","severity","text"],"type":"string"},"default_value":{"type":["boolean","string"]},"description":{"type":"string"},"key":{"type":"string"},"label":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"}},"required":["control","description","key","label","required"],"type":"object"},"type":"array"},"description":{"type":"string"},"docs_url":{"format":"uri","type":"string"},"key":{"enum":["aws_cloudwatch","generic_webhook","prometheus_alertmanager","grafana","datadog","pagerduty_events_v2"],"type":"string"},"name":{"type":"string"},"required_config":{"items":{"type":"string"},"type":"array"},"setup_mode":{"enum":["api_key","signed_webhook"],"type":"string"}},"required":["auth_methods","capabilities","config_fields","description","docs_url","key","name","required_config","setup_mode"],"type":"object"},"type":"array"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/alert-connectors":{"get":{"operationId":"alertConnectors.list","summary":"List inbound alert connectors for a project","description":"List inbound alert connectors for a project","tags":["alertConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Project alert connectors","content":{"application/json":{"schema":{"items":{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"},"resolve_on_ok":{"type":"boolean"},"topic_arn":{"type":"string"}},"type":"object"},"created_at":{"format":"date-time","type":"string"},"display_name":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"last_error":{"type":["string","null"]},"last_received_at":{"format":"date-time","type":["string","null"]},"previous_secret_expires_at":{"format":"date-time","type":["string","null"]},"project_id":{"type":"string"},"provider":{"enum":["aws_cloudwatch","generic_webhook","prometheus_alertmanager","grafana","datadog","pagerduty_events_v2"],"type":"string"},"secret_prefix":{"type":["string","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["config","created_at","display_name","enabled","id","last_error","last_received_at","previous_secret_expires_at","project_id","provider","secret_prefix","updated_at"],"type":"object"},"type":"array"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"alertConnectors.create","summary":"Create an inbound alert connector","description":"Create an inbound alert connector","tags":["alertConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"description":"Create one provider-specific inbound alert connector. AWS requires config.topic_arn; webhook providers accept only config.default_severity.","oneOf":[{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"}},"type":"object"},"display_name":{"minLength":1,"maxLength":255,"type":"string"},"provider":{"enum":["generic_webhook"],"type":"string"}},"required":["provider"],"type":"object"},{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"}},"type":"object"},"display_name":{"minLength":1,"maxLength":255,"type":"string"},"provider":{"enum":["prometheus_alertmanager"],"type":"string"}},"required":["provider"],"type":"object"},{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"}},"type":"object"},"display_name":{"minLength":1,"maxLength":255,"type":"string"},"provider":{"enum":["grafana"],"type":"string"}},"required":["provider"],"type":"object"},{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"}},"type":"object"},"display_name":{"minLength":1,"maxLength":255,"type":"string"},"provider":{"enum":["datadog"],"type":"string"}},"required":["provider"],"type":"object"},{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"}},"type":"object"},"display_name":{"minLength":1,"maxLength":255,"type":"string"},"provider":{"enum":["pagerduty_events_v2"],"type":"string"}},"required":["provider"],"type":"object"},{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"},"resolve_on_ok":{"description":"Resolve the linked incident when CloudWatch reports OK. Defaults to true.","type":"boolean"},"topic_arn":{"description":"Exact SNS topic ARN allowed to deliver CloudWatch alarm notifications.","pattern":"^arn:(aws|aws-us-gov|aws-cn):sns:[a-z0-9-]+:[0-9]{12}:[A-Za-z0-9_-]{1,256}$","type":"string"}},"required":["topic_arn"],"type":"object"},"display_name":{"minLength":1,"maxLength":255,"type":"string"},"provider":{"enum":["aws_cloudwatch"],"type":"string"}},"required":["config","provider"],"type":"object"}],"properties":{"config":{"oneOf":[{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"}},"type":"object"},{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"},"resolve_on_ok":{"description":"Resolve the linked incident when CloudWatch reports OK. Defaults to true.","type":"boolean"},"topic_arn":{"description":"Exact SNS topic ARN allowed to deliver CloudWatch alarm notifications.","pattern":"^arn:(aws|aws-us-gov|aws-cn):sns:[a-z0-9-]+:[0-9]{12}:[A-Za-z0-9_-]{1,256}$","type":"string"}},"required":["topic_arn"],"type":"object"}]},"display_name":{"minLength":1,"maxLength":255,"type":"string"},"provider":{"enum":["aws_cloudwatch","generic_webhook","prometheus_alertmanager","grafana","datadog","pagerduty_events_v2"],"type":"string"}},"required":["provider"],"type":"object"}}}},"responses":{"201":{"description":"Created connector and its one-time setup credential","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"connector":{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"},"resolve_on_ok":{"type":"boolean"},"topic_arn":{"type":"string"}},"type":"object"},"created_at":{"format":"date-time","type":"string"},"display_name":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"last_error":{"type":["string","null"]},"last_received_at":{"format":"date-time","type":["string","null"]},"previous_secret_expires_at":{"format":"date-time","type":["string","null"]},"project_id":{"type":"string"},"provider":{"enum":["aws_cloudwatch","generic_webhook","prometheus_alertmanager","grafana","datadog","pagerduty_events_v2"],"type":"string"},"secret_prefix":{"type":["string","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["config","created_at","display_name","enabled","id","last_error","last_received_at","previous_secret_expires_at","project_id","provider","secret_prefix","updated_at"],"type":"object"},"setup":{"additionalProperties":false,"properties":{"authorization_header":{"type":["string","null"]},"endpoint":{"format":"uri","type":"string"},"routing_key":{"type":["string","null"]},"secret":{"type":["string","null"]}},"required":["authorization_header","endpoint","routing_key","secret"],"type":"object"}},"required":["connector","setup"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/alert-connectors/{connector_id}":{"get":{"operationId":"alertConnectors.get","summary":"Get an inbound alert connector","description":"Get an inbound alert connector","tags":["alertConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connector_id","in":"path","required":true,"description":"Path parameter connector_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Alert connector","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"},"resolve_on_ok":{"type":"boolean"},"topic_arn":{"type":"string"}},"type":"object"},"created_at":{"format":"date-time","type":"string"},"display_name":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"last_error":{"type":["string","null"]},"last_received_at":{"format":"date-time","type":["string","null"]},"previous_secret_expires_at":{"format":"date-time","type":["string","null"]},"project_id":{"type":"string"},"provider":{"enum":["aws_cloudwatch","generic_webhook","prometheus_alertmanager","grafana","datadog","pagerduty_events_v2"],"type":"string"},"secret_prefix":{"type":["string","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["config","created_at","display_name","enabled","id","last_error","last_received_at","previous_secret_expires_at","project_id","provider","secret_prefix","updated_at"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"alertConnectors.update","summary":"Update an inbound alert connector","description":"Update an inbound alert connector","tags":["alertConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connector_id","in":"path","required":true,"description":"Path parameter connector_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"description":"Update connector fields. Config must match the connector's existing provider; AWS config includes topic_arn.","properties":{"config":{"oneOf":[{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"}},"type":"object"},{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"},"resolve_on_ok":{"description":"Resolve the linked incident when CloudWatch reports OK. Defaults to true.","type":"boolean"},"topic_arn":{"description":"Exact SNS topic ARN allowed to deliver CloudWatch alarm notifications.","pattern":"^arn:(aws|aws-us-gov|aws-cn):sns:[a-z0-9-]+:[0-9]{12}:[A-Za-z0-9_-]{1,256}$","type":"string"}},"required":["topic_arn"],"type":"object"}]},"display_name":{"minLength":1,"maxLength":255,"type":"string"},"enabled":{"type":"boolean"}},"type":"object"}}}},"responses":{"200":{"description":"Updated alert connector","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"},"resolve_on_ok":{"type":"boolean"},"topic_arn":{"type":"string"}},"type":"object"},"created_at":{"format":"date-time","type":"string"},"display_name":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"last_error":{"type":["string","null"]},"last_received_at":{"format":"date-time","type":["string","null"]},"previous_secret_expires_at":{"format":"date-time","type":["string","null"]},"project_id":{"type":"string"},"provider":{"enum":["aws_cloudwatch","generic_webhook","prometheus_alertmanager","grafana","datadog","pagerduty_events_v2"],"type":"string"},"secret_prefix":{"type":["string","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["config","created_at","display_name","enabled","id","last_error","last_received_at","previous_secret_expires_at","project_id","provider","secret_prefix","updated_at"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"alertConnectors.delete","summary":"Delete an inbound alert connector","description":"Delete an inbound alert connector","tags":["alertConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connector_id","in":"path","required":true,"description":"Path parameter connector_id","schema":{"type":"string"}}],"responses":{"204":{"description":"Alert connector deleted"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/alert-connectors/{connector_id}/deliveries":{"get":{"operationId":"alertConnectors.listDeliveries","summary":"List retained delivery outcomes for an active or deleted inbound alert connector using stable cursor pagination","description":"List retained delivery outcomes for an active or deleted inbound alert connector using stable cursor pagination","tags":["alertConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connector_id","in":"path","required":true,"description":"Path parameter connector_id","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Opaque next_cursor value returned by the previous page","schema":{"maxLength":512,"minLength":1,"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size from 1 to 100. Supplying limit or cursor selects the cursor-page response; omit both for the legacy first-page array.","schema":{"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"description":"Recent connector delivery outcomes","content":{"application/json":{"schema":{"oneOf":[{"description":"Legacy first-page response returned when neither limit nor cursor is supplied. New integrations should request a limit and use the cursor page response.","items":{"additionalProperties":false,"properties":{"connector_id":{"type":"string"},"error_code":{"type":["string","null"]},"error_message":{"type":["string","null"]},"external_alert_id":{"type":"string"},"id":{"type":"string"},"incident_id":{"type":["string","null"]},"outcome":{"enum":["failed","ignored","opened","resolved","updated"],"type":"string"},"processed_at":{"format":"date-time","type":"string"},"provider_event_id":{"type":["string","null"]},"received_at":{"format":"date-time","type":"string"}},"required":["connector_id","error_code","error_message","external_alert_id","id","incident_id","outcome","processed_at","provider_event_id","received_at"],"type":"object"},"type":"array"},{"additionalProperties":false,"properties":{"data":{"items":{"additionalProperties":false,"properties":{"connector_id":{"type":"string"},"error_code":{"type":["string","null"]},"error_message":{"type":["string","null"]},"external_alert_id":{"type":"string"},"id":{"type":"string"},"incident_id":{"type":["string","null"]},"outcome":{"enum":["failed","ignored","opened","resolved","updated"],"type":"string"},"processed_at":{"format":"date-time","type":"string"},"provider_event_id":{"type":["string","null"]},"received_at":{"format":"date-time","type":"string"}},"required":["connector_id","error_code","error_message","external_alert_id","id","incident_id","outcome","processed_at","provider_event_id","received_at"],"type":"object"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["data","next_cursor"],"type":"object"}]}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/alert-connectors/{connector_id}/rotate-secret":{"post":{"operationId":"alertConnectors.rotateSecret","summary":"Rotate a generic webhook connector secret","description":"Rotate a generic webhook connector secret","tags":["alertConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connector_id","in":"path","required":true,"description":"Path parameter connector_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Rotated one-time connector setup credential","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"connector":{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"properties":{"default_severity":{"description":"Fallback project incident-severity key when the provider event has none. Severity keys are project-configurable and are not a closed enum.","maxLength":64,"minLength":1,"type":"string"},"resolve_on_ok":{"type":"boolean"},"topic_arn":{"type":"string"}},"type":"object"},"created_at":{"format":"date-time","type":"string"},"display_name":{"type":"string"},"enabled":{"type":"boolean"},"id":{"type":"string"},"last_error":{"type":["string","null"]},"last_received_at":{"format":"date-time","type":["string","null"]},"previous_secret_expires_at":{"format":"date-time","type":["string","null"]},"project_id":{"type":"string"},"provider":{"enum":["aws_cloudwatch","generic_webhook","prometheus_alertmanager","grafana","datadog","pagerduty_events_v2"],"type":"string"},"secret_prefix":{"type":["string","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["config","created_at","display_name","enabled","id","last_error","last_received_at","previous_secret_expires_at","project_id","provider","secret_prefix","updated_at"],"type":"object"},"setup":{"additionalProperties":false,"properties":{"authorization_header":{"type":["string","null"]},"endpoint":{"format":"uri","type":"string"},"routing_key":{"type":["string","null"]},"secret":{"type":["string","null"]}},"required":["authorization_header","endpoint","routing_key","secret"],"type":"object"}},"required":["connector","setup"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/alert-connectors/{connector_id}/test":{"post":{"operationId":"alertConnectors.test","summary":"Check connector readiness and recent provider delivery","description":"Check connector readiness and recent provider delivery","tags":["alertConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connector_id","in":"path","required":true,"description":"Path parameter connector_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Connector readiness result","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"accepted":{"type":"boolean"},"message":{"type":"string"}},"required":["accepted","message"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/ai/stats":{"get":{"operationId":"ai.stats","summary":"Get aggregate AI request and session stats for a project","description":"Get aggregate AI request and session stats for a project","tags":["ai"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/ai/histogram":{"get":{"operationId":"ai.histogram","summary":"Get AI request, cost, and latency buckets over time for a project","description":"Get AI request, cost, and latency buckets over time for a project","tags":["ai"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/ai/sessions":{"get":{"operationId":"ai.sessions","summary":"List AI sessions for a project with search, errors-only filtering, and pagination","description":"List AI sessions for a project with search, errors-only filtering, and pagination","tags":["ai"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Query parameter from","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Query parameter to","schema":{"type":"string","format":"date-time"}},{"name":"q","in":"query","required":false,"description":"Query parameter q","schema":{"type":"string"}},{"name":"errors_only","in":"query","required":false,"description":"Query parameter errors_only","schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Query parameter offset","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/ai/metrics":{"get":{"operationId":"ai.metrics","summary":"List OTLP metric series reported for a project, aggregated per metric and service","description":"List OTLP metric series reported for a project, aggregated per metric and service","tags":["ai"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Query parameter from","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Query parameter to","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/ai/sessions/{session_id}":{"get":{"operationId":"ai.getSession","summary":"Get AI session detail for a project","description":"Get AI session detail for a project","tags":["ai"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"session_id","in":"path","required":true,"description":"Path parameter session_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/ai/users/{user_id}":{"get":{"operationId":"ai.getUser","summary":"Get AI user detail for a project, optionally bounded by from/to timestamps","description":"Get AI user detail for a project, optionally bounded by from/to timestamps","tags":["ai"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"user_id","in":"path","required":true,"description":"Path parameter user_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/ai/fixes/stats":{"get":{"operationId":"ai.fixStats","summary":"Get hosted fixer dispatch and completion breakdowns for a project","description":"Get hosted fixer dispatch and completion breakdowns for a project","tags":["ai"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/ai/fixes/timeline":{"get":{"operationId":"ai.fixTimeline","summary":"Get hosted fixer dispatch counts over time for a project","description":"Get hosted fixer dispatch counts over time for a project","tags":["ai"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/dashboards":{"get":{"operationId":"dashboards.list","summary":"List dashboards for a project","description":"List dashboards for a project","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"dashboards.create","summary":"Create a dashboard","description":"Create a dashboard","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/dashboards/{dashboard_id}":{"get":{"operationId":"dashboards.get","summary":"Get a dashboard and its widgets","description":"Get a dashboard and its widgets","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"dashboard_id","in":"path","required":true,"description":"Path parameter dashboard_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"dashboards.update","summary":"Update dashboard metadata, layout, or sharing state","description":"Update dashboard metadata, layout, or sharing state","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"dashboard_id","in":"path","required":true,"description":"Path parameter dashboard_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"dashboards.delete","summary":"Delete a dashboard and its widgets","description":"Delete a dashboard and its widgets","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"dashboard_id","in":"path","required":true,"description":"Path parameter dashboard_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/dashboards/{dashboard_id}/widgets":{"post":{"operationId":"dashboards.createWidget","summary":"Add a widget to a dashboard","description":"Add a widget to a dashboard","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"dashboard_id","in":"path","required":true,"description":"Path parameter dashboard_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/dashboards/{dashboard_id}/widgets/{widget_id}":{"patch":{"operationId":"dashboards.updateWidget","summary":"Update an existing dashboard widget","description":"Update an existing dashboard widget","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"dashboard_id","in":"path","required":true,"description":"Path parameter dashboard_id","schema":{"type":"string"}},{"name":"widget_id","in":"path","required":true,"description":"Path parameter widget_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"dashboards.deleteWidget","summary":"Remove a widget from a dashboard","description":"Remove a widget from a dashboard","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"dashboard_id","in":"path","required":true,"description":"Path parameter dashboard_id","schema":{"type":"string"}},{"name":"widget_id","in":"path","required":true,"description":"Path parameter widget_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/dashboard-templates":{"get":{"operationId":"dashboards.listTemplates","summary":"List prebuilt dashboard templates with their category, the data each needs, and whether this project has that data (readiness).","description":"List prebuilt dashboard templates with their category, the data each needs, and whether this project has that data (readiness).","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"readiness","in":"query","required":false,"description":"Set to `false` to skip the readiness check. Defaults to `true`.","schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"Dashboard templates","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"category":{"type":"string","enum":["ai","application","database","edge","infrastructure","runtime","web"]},"requires":{"type":"object","description":"The data a template needs. Every listed signal, metric name prefix, and span attribute must be present.","properties":{"signals":{"type":"array","items":{"type":"string","enum":["ai","errors","logs","metrics","traces","vitals"]}},"metric_prefixes":{"type":"array","items":{"type":"string"},"description":"At least one metric name must start with each prefix, such as `system.`."},"attributes":{"type":"array","items":{"type":"object","properties":{"signal":{"type":"string","enum":["traces"]},"key":{"type":"string","description":"OpenTelemetry attribute key."},"values":{"type":"array","items":{"type":"string"},"description":"When present, a span must carry one of these values."}},"required":["signal","key"],"additionalProperties":false}}},"additionalProperties":false},"readiness":{"type":"object","description":"`ready`: all required data seen in the last 24 hours. `no_recent_data`: seen in the last 7 days only. `needs_setup`: some required data not seen in 7 days.","properties":{"status":{"type":"string","enum":["needs_setup","no_recent_data","ready"]},"checked_at":{"type":"string","format":"date-time"},"missing":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["attribute","metric_prefix","signal"]},"value":{"type":"string"},"state":{"type":"string","enum":["never_seen","stale"],"description":"`stale`: seen in the last 7 days but not the last 24 hours."},"hint":{"type":"string"},"docs_url":{"type":"string","format":"uri"}},"required":["kind","value","state","hint","docs_url"],"additionalProperties":false}}},"required":["status","checked_at","missing"],"additionalProperties":false},"layout":{"type":"array","items":{"type":"object","properties":{"widget_id":{"type":"string"},"x":{"type":"integer"},"y":{"type":"integer"},"w":{"type":"integer"},"h":{"type":"integer"}},"required":["widget_id","x","y","w","h"]}},"widgets":{"type":"array","items":{"type":"object","properties":{"widget_id":{"type":"string"},"chart_type":{"type":"string","enum":["line","bar","area","pie","table"]},"query":{"type":"object","properties":{"source":{"type":"string","enum":["ai","errors","fixes","ingestion","logs","metrics","traces","vitals"]},"aggregation":{"type":"string","enum":["count","avg","p50","p90","p95","p99","sum"]},"environment":{"type":"string","description":"Optional environment filter."},"filters":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Queryable dashboard field name."},"operator":{"type":"string","enum":["eq","neq"],"description":"Filter comparison operator. Defaults to eq when omitted."},"value":{"type":"string","description":"Filter value."}},"required":["field","value"],"additionalProperties":false}},"from":{"type":"string","format":"date-time","description":"Absolute range start. Requires `to`; overrides `time_range` when present."},"group_by":{"type":"string","description":"Optional grouping field."},"metric_name":{"type":"string","description":"Metric name. For traces widgets, an optional span name; omit it to read every span."},"metric_type":{"type":"string","enum":["gauge","sum","hist","exponential_histogram"]},"q":{"type":"string","description":"Search query for logs and errors widgets."},"service_name":{"type":"string","description":"Optional service filter for metrics widgets."},"time_range":{"type":"string","description":"Relative range such as 5m, 1h, 24h, or 7d."},"to":{"type":"string","format":"date-time","description":"Absolute range end. Requires `from`; overrides `time_range` when present."}},"required":["source","aggregation","time_range"],"additionalProperties":false},"title":{"type":"string"},"config":{"type":"object"}},"required":["widget_id","chart_type","query","title","config"]}}},"required":["id","name","description","layout","widgets"]}}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/dashboard-templates/{template_id}/preview":{"get":{"operationId":"dashboards.previewTemplate","summary":"Run every widget of a dashboard template for this project without saving a dashboard. Returns the same per-widget summary as a dashboard snapshot. The range is at most 7d.","description":"Run every widget of a dashboard template for this project without saving a dashboard. Returns the same per-widget summary as a dashboard snapshot. The range is at most 7d.","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"template_id","in":"path","required":true,"description":"Path parameter template_id","schema":{"type":"string"}},{"name":"time_range","in":"query","required":false,"description":"Relative range for every widget, such as 1h, 24h, or 7d (at most 7d).","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"service_name","in":"query","required":false,"description":"Query parameter service_name","schema":{"type":"string"}}],"responses":{"200":{"description":"Template preview","content":{"application/json":{"schema":{"type":"object","properties":{"template_id":{"type":"string"},"name":{"type":"string"},"generated_at":{"type":"string","format":"date-time"},"duration_ms":{"type":"integer"},"widgets":{"type":"array","items":{"type":"object","properties":{"cache":{"type":"object","properties":{"age_ms":{"type":["number","null"]},"cached_at":{"type":["string","null"],"format":"date-time"},"expires_at":{"type":["string","null"],"format":"date-time"},"next_allowed_refresh_at":{"type":["string","null"],"format":"date-time"},"refresh_mode":{"type":"string","enum":["normal","force","bypass"]},"status":{"type":"string","enum":["hit","miss","stale","force","refresh_throttled","bypass"]},"ttl_ms":{"type":"number"}},"required":["status","cached_at","expires_at","age_ms","ttl_ms","next_allowed_refresh_at","refresh_mode"],"additionalProperties":false},"chart_type":{"type":"string","enum":["line","bar","area","pie","table"]},"data":{"type":"object","properties":{"aggregation":{"type":"string","enum":["count","avg","p50","p90","p95","p99","sum"]},"cache":{"type":"object","properties":{"age_ms":{"type":["number","null"]},"cached_at":{"type":["string","null"],"format":"date-time"},"expires_at":{"type":["string","null"],"format":"date-time"},"next_allowed_refresh_at":{"type":["string","null"],"format":"date-time"},"refresh_mode":{"type":"string","enum":["normal","force","bypass"]},"status":{"type":"string","enum":["hit","miss","stale","force","refresh_throttled","bypass"]},"ttl_ms":{"type":"number"}},"required":["status","cached_at","expires_at","age_ms","ttl_ms","next_allowed_refresh_at","refresh_mode"],"additionalProperties":false},"data":{"type":"array","items":{"type":"object","properties":{"bucket":{"type":"string"},"group":{"type":["string","null"]},"value":{"type":"number"}},"required":["bucket","group","value"],"additionalProperties":false}},"from":{"type":"string","format":"date-time"},"granularity":{"type":"string"},"group_by":{"type":"string"},"source":{"type":"string","enum":["ai","errors","fixes","ingestion","logs","metrics","traces","vitals"]},"time_range":{"type":"string"},"to":{"type":"string","format":"date-time"}},"required":["source","aggregation","time_range","granularity","from","to","data"],"additionalProperties":false},"error":{"type":"string"},"position":{"type":"object","properties":{"h":{"type":"integer"},"w":{"type":"integer"},"widget_id":{"type":"string"},"x":{"type":"integer"},"y":{"type":"integer"}},"required":["widget_id","x","y","w","h"],"additionalProperties":false},"query":{"type":"object","properties":{"source":{"type":"string","enum":["ai","errors","fixes","ingestion","logs","metrics","traces","vitals"]},"aggregation":{"type":"string","enum":["count","avg","p50","p90","p95","p99","sum"]},"environment":{"type":"string","description":"Optional environment filter."},"filters":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Queryable dashboard field name."},"operator":{"type":"string","enum":["eq","neq"],"description":"Filter comparison operator. Defaults to eq when omitted."},"value":{"type":"string","description":"Filter value."}},"required":["field","value"],"additionalProperties":false}},"from":{"type":"string","format":"date-time","description":"Absolute range start. Requires `to`; overrides `time_range` when present."},"group_by":{"type":"string","description":"Optional grouping field."},"metric_name":{"type":"string","description":"Metric name. For traces widgets, an optional span name; omit it to read every span."},"metric_type":{"type":"string","enum":["gauge","sum","hist","exponential_histogram"]},"q":{"type":"string","description":"Search query for logs and errors widgets."},"service_name":{"type":"string","description":"Optional service filter for metrics widgets."},"time_range":{"type":"string","description":"Relative range such as 5m, 1h, 24h, or 7d."},"to":{"type":"string","format":"date-time","description":"Absolute range end. Requires `from`; overrides `time_range` when present."}},"required":["source","aggregation","time_range"],"additionalProperties":false},"status":{"type":"string","enum":["ok","empty","error"]},"summary":{"type":"string"},"title":{"type":"string"},"widget_id":{"type":"string"}},"required":["widget_id","title","chart_type","position","query","status","summary"],"additionalProperties":false}}},"required":["template_id","name","generated_at","duration_ms","widgets"],"additionalProperties":false}}}},"400":{"description":"Invalid preview range","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["QUERY_REJECTED","QUERY_TEMPORARILY_UNAVAILABLE","UPSTREAM_QUERY_FAILED"]},"hint":{"type":"string"},"message":{"type":"string"}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Dashboard template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/dashboards/from-template":{"post":{"operationId":"dashboards.createFromTemplate","summary":"Create a dashboard from a template","description":"Create a dashboard from a template","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/dashboards/apply":{"post":{"operationId":"dashboards.apply","summary":"Create or update a dashboard from a dashboard definition","description":"Create or update a dashboard from a dashboard definition","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/dashboard-query":{"post":{"operationId":"dashboards.executeQuery","summary":"Execute a dashboard widget query. Use time_range for relative windows, or provide both from and to ISO timestamps for an absolute window.","description":"Execute a dashboard widget query. Use time_range for relative windows, or provide both from and to ISO timestamps for an absolute window.","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","enum":["ai","errors","fixes","ingestion","logs","metrics","traces","vitals"]},"aggregation":{"type":"string","enum":["count","avg","p50","p90","p95","p99","sum"]},"environment":{"type":"string","description":"Optional environment filter."},"filters":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Queryable dashboard field name."},"operator":{"type":"string","enum":["eq","neq"],"description":"Filter comparison operator. Defaults to eq when omitted."},"value":{"type":"string","description":"Filter value."}},"required":["field","value"],"additionalProperties":false}},"from":{"type":"string","format":"date-time","description":"Absolute range start. Requires `to`; overrides `time_range` when present."},"group_by":{"type":"string","description":"Optional grouping field."},"metric_name":{"type":"string","description":"Metric name. For traces widgets, an optional span name; omit it to read every span."},"metric_type":{"type":"string","enum":["gauge","sum","hist","exponential_histogram"]},"q":{"type":"string","description":"Search query for logs and errors widgets."},"service_name":{"type":"string","description":"Optional service filter for metrics widgets."},"time_range":{"type":"string","description":"Relative range such as 5m, 1h, 24h, or 7d."},"to":{"type":"string","format":"date-time","description":"Absolute range end. Requires `from`; overrides `time_range` when present."}},"required":["source","aggregation","time_range"],"additionalProperties":false}}}},"responses":{"200":{"description":"Dashboard query result","content":{"application/json":{"schema":{"type":"object","properties":{"aggregation":{"type":"string","enum":["count","avg","p50","p90","p95","p99","sum"]},"cache":{"type":"object","properties":{"age_ms":{"type":["number","null"]},"cached_at":{"type":["string","null"],"format":"date-time"},"expires_at":{"type":["string","null"],"format":"date-time"},"next_allowed_refresh_at":{"type":["string","null"],"format":"date-time"},"refresh_mode":{"type":"string","enum":["normal","force","bypass"]},"status":{"type":"string","enum":["hit","miss","stale","force","refresh_throttled","bypass"]},"ttl_ms":{"type":"number"}},"required":["status","cached_at","expires_at","age_ms","ttl_ms","next_allowed_refresh_at","refresh_mode"],"additionalProperties":false},"data":{"type":"array","items":{"type":"object","properties":{"bucket":{"type":"string"},"group":{"type":["string","null"]},"value":{"type":"number"}},"required":["bucket","group","value"],"additionalProperties":false}},"from":{"type":"string","format":"date-time"},"granularity":{"type":"string"},"group_by":{"type":"string"},"source":{"type":"string","enum":["ai","errors","fixes","ingestion","logs","metrics","traces","vitals"]},"time_range":{"type":"string"},"to":{"type":"string","format":"date-time"}},"required":["source","aggregation","time_range","granularity","from","to","data"],"additionalProperties":false}}}},"400":{"description":"Invalid dashboard query","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["QUERY_REJECTED","QUERY_TEMPORARILY_UNAVAILABLE","UPSTREAM_QUERY_FAILED"]},"hint":{"type":"string"},"message":{"type":"string"}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Dashboard query backend is temporarily saturated","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["QUERY_REJECTED","QUERY_TEMPORARILY_UNAVAILABLE","UPSTREAM_QUERY_FAILED"]},"hint":{"type":"string"},"message":{"type":"string"}},"required":["error"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/dashboard-query/insight":{"post":{"operationId":"dashboards.inspectQuery","summary":"Get an AI/operator-friendly breakdown for one dashboard widget query. Use time_range for relative windows, or provide both from and to ISO timestamps for an absolute window.","description":"Get an AI/operator-friendly breakdown for one dashboard widget query. Use time_range for relative windows, or provide both from and to ISO timestamps for an absolute window.","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","enum":["ai","errors","fixes","ingestion","logs","metrics","traces","vitals"]},"aggregation":{"type":"string","enum":["count","avg","p50","p90","p95","p99","sum"]},"environment":{"type":"string","description":"Optional environment filter."},"filters":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Queryable dashboard field name."},"operator":{"type":"string","enum":["eq","neq"],"description":"Filter comparison operator. Defaults to eq when omitted."},"value":{"type":"string","description":"Filter value."}},"required":["field","value"],"additionalProperties":false}},"from":{"type":"string","format":"date-time","description":"Absolute range start. Requires `to`; overrides `time_range` when present."},"group_by":{"type":"string","description":"Optional grouping field."},"metric_name":{"type":"string","description":"Metric name. For traces widgets, an optional span name; omit it to read every span."},"metric_type":{"type":"string","enum":["gauge","sum","hist","exponential_histogram"]},"q":{"type":"string","description":"Search query for logs and errors widgets."},"service_name":{"type":"string","description":"Optional service filter for metrics widgets."},"time_range":{"type":"string","description":"Relative range such as 5m, 1h, 24h, or 7d."},"to":{"type":"string","format":"date-time","description":"Absolute range end. Requires `from`; overrides `time_range` when present."}},"required":["source","aggregation","time_range"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/dashboards/{dashboard_id}/snapshot":{"get":{"operationId":"dashboards.snapshot","summary":"Capture every widget on a dashboard in one call — runs each widget's query in parallel and returns a per-widget summary alongside the timeseries. Built for LLM agents answering 'how does dashboard X look right now?' without doing N round-trips.","description":"Capture every widget on a dashboard in one call — runs each widget's query in parallel and returns a per-widget summary alongside the timeseries. Built for LLM agents answering 'how does dashboard X look right now?' without doing N round-trips.","tags":["dashboards"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"dashboard_id","in":"path","required":true,"description":"Path parameter dashboard_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Dashboard snapshot","content":{"application/json":{"schema":{"type":"object","properties":{"cache_summary":{"type":"object","properties":{"bypassed_widgets":{"type":"number"},"cached_widgets":{"type":"number"},"oldest_age_ms":{"type":["number","null"]},"refreshed_widgets":{"type":"number"},"throttled_widgets":{"type":"number"},"total_widgets":{"type":"number"}},"required":["total_widgets","cached_widgets","refreshed_widgets","throttled_widgets","bypassed_widgets","oldest_age_ms"],"additionalProperties":false},"description":{"type":["string","null"]},"duration_ms":{"type":"integer"},"generated_at":{"type":"string","format":"date-time"},"id":{"type":"string"},"name":{"type":"string"},"widgets":{"type":"array","items":{"type":"object","properties":{"cache":{"type":"object","properties":{"age_ms":{"type":["number","null"]},"cached_at":{"type":["string","null"],"format":"date-time"},"expires_at":{"type":["string","null"],"format":"date-time"},"next_allowed_refresh_at":{"type":["string","null"],"format":"date-time"},"refresh_mode":{"type":"string","enum":["normal","force","bypass"]},"status":{"type":"string","enum":["hit","miss","stale","force","refresh_throttled","bypass"]},"ttl_ms":{"type":"number"}},"required":["status","cached_at","expires_at","age_ms","ttl_ms","next_allowed_refresh_at","refresh_mode"],"additionalProperties":false},"chart_type":{"type":"string","enum":["line","bar","area","pie","table"]},"data":{"type":"object","properties":{"aggregation":{"type":"string","enum":["count","avg","p50","p90","p95","p99","sum"]},"cache":{"type":"object","properties":{"age_ms":{"type":["number","null"]},"cached_at":{"type":["string","null"],"format":"date-time"},"expires_at":{"type":["string","null"],"format":"date-time"},"next_allowed_refresh_at":{"type":["string","null"],"format":"date-time"},"refresh_mode":{"type":"string","enum":["normal","force","bypass"]},"status":{"type":"string","enum":["hit","miss","stale","force","refresh_throttled","bypass"]},"ttl_ms":{"type":"number"}},"required":["status","cached_at","expires_at","age_ms","ttl_ms","next_allowed_refresh_at","refresh_mode"],"additionalProperties":false},"data":{"type":"array","items":{"type":"object","properties":{"bucket":{"type":"string"},"group":{"type":["string","null"]},"value":{"type":"number"}},"required":["bucket","group","value"],"additionalProperties":false}},"from":{"type":"string","format":"date-time"},"granularity":{"type":"string"},"group_by":{"type":"string"},"source":{"type":"string","enum":["ai","errors","fixes","ingestion","logs","metrics","traces","vitals"]},"time_range":{"type":"string"},"to":{"type":"string","format":"date-time"}},"required":["source","aggregation","time_range","granularity","from","to","data"],"additionalProperties":false},"error":{"type":"string"},"position":{"type":"object","properties":{"h":{"type":"integer"},"w":{"type":"integer"},"widget_id":{"type":"string"},"x":{"type":"integer"},"y":{"type":"integer"}},"required":["widget_id","x","y","w","h"],"additionalProperties":false},"query":{"type":"object","properties":{"source":{"type":"string","enum":["ai","errors","fixes","ingestion","logs","metrics","traces","vitals"]},"aggregation":{"type":"string","enum":["count","avg","p50","p90","p95","p99","sum"]},"environment":{"type":"string","description":"Optional environment filter."},"filters":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Queryable dashboard field name."},"operator":{"type":"string","enum":["eq","neq"],"description":"Filter comparison operator. Defaults to eq when omitted."},"value":{"type":"string","description":"Filter value."}},"required":["field","value"],"additionalProperties":false}},"from":{"type":"string","format":"date-time","description":"Absolute range start. Requires `to`; overrides `time_range` when present."},"group_by":{"type":"string","description":"Optional grouping field."},"metric_name":{"type":"string","description":"Metric name. For traces widgets, an optional span name; omit it to read every span."},"metric_type":{"type":"string","enum":["gauge","sum","hist","exponential_histogram"]},"q":{"type":"string","description":"Search query for logs and errors widgets."},"service_name":{"type":"string","description":"Optional service filter for metrics widgets."},"time_range":{"type":"string","description":"Relative range such as 5m, 1h, 24h, or 7d."},"to":{"type":"string","format":"date-time","description":"Absolute range end. Requires `from`; overrides `time_range` when present."}},"required":["source","aggregation","time_range"],"additionalProperties":false},"status":{"type":"string","enum":["ok","empty","error"]},"summary":{"type":"string"},"title":{"type":"string"},"widget_id":{"type":"string"}},"required":["widget_id","title","chart_type","position","query","status","summary"],"additionalProperties":false}}},"required":["id","name","description","generated_at","duration_ms","widgets"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/dashboards/{dashboard_id}/public":{"get":{"operationId":"dashboards.getPublic","summary":"Fetch a shared dashboard without authentication","description":"Fetch a shared dashboard without authentication","tags":["dashboards"],"security":[],"parameters":[{"name":"dashboard_id","in":"path","required":true,"description":"Path parameter dashboard_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/dashboards/shared/{token}":{"get":{"operationId":"dashboards.getPublicByToken","summary":"Fetch a shared dashboard by its public sharing token","description":"Fetch a shared dashboard by its public sharing token","tags":["dashboards"],"security":[],"parameters":[{"name":"token","in":"path","required":true,"description":"Path parameter token","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/agent/settings":{"get":{"operationId":"agent.getSettings","summary":"Read the Squasher Agent's behavior settings: proactive alert level, pull request reviews, automatic fixes, reply style, daily alert cap, daily review, and alert channel","description":"Read the Squasher Agent's behavior settings: proactive alert level, pull request reviews, automatic fixes, reply style, daily alert cap, daily review, and alert channel","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"agent.updateSettings","summary":"Change the Squasher Agent's behavior settings (proactive_alerts, pr_review, auto_fix, reply_style, daily_alert_cap, daily_review, alert_channel_id)","description":"Change the Squasher Agent's behavior settings (proactive_alerts, pr_review, auto_fix, reply_style, daily_alert_cap, daily_review, alert_channel_id)","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/agent/memory":{"get":{"operationId":"agent.listMemory","summary":"List the Squasher Agent's active memory for the project: team rules, preferences, facts, and incident notes, including organization-wide entries","description":"List the Squasher Agent's active memory for the project: team rules, preferences, facts, and incident notes, including organization-wide entries","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"agent.createMemory","summary":"Add a rule, preference, fact, or incident note to the Squasher Agent's memory; rules that map to a setting also change that setting","description":"Add a rule, preference, fact, or incident note to the Squasher Agent's memory; rules that map to a setting also change that setting","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/agent/memory/{memory_id}":{"delete":{"operationId":"agent.deleteMemory","summary":"Retire a Squasher Agent memory entry","description":"Retire a Squasher Agent memory entry","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"memory_id","in":"path","required":true,"description":"Path parameter memory_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/agent/memory/files":{"get":{"operationId":"agent.listMemoryFiles","summary":"List the Squasher Agent's memory files with their note counts, or read one file with ?path=; the response includes the current commit number","description":"List the Squasher Agent's memory files with their note counts, or read one file with ?path=; the response includes the current commit number","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"path","in":"query","required":false,"description":"File path relative to the memory root, such as MEMORY.md, notes/checkout.md, or org/rules.md (org/ is shared by every project)","schema":{"maxLength":300,"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"agent.writeMemoryFile","summary":"Replace one Squasher Agent memory file as one commit. Keep each line's [id:...] tag to edit that note; a line without a tag is a new note and a missing line removes its note. Pass base_commit from your read so notes changed since then are not overwritten; refused lines are listed","description":"Replace one Squasher Agent memory file as one commit. Keep each line's [id:...] tag to edit that note; a line without a tag is a new note and a missing line removes its note. Pass base_commit from your read so notes changed since then are not overwritten; refused lines are listed","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"base_commit":{"description":"Commit number you read the file at; omit to overwrite","minimum":0,"type":["integer","null"]},"content":{"description":"The whole new file","maxLength":200000,"type":"string"},"path":{"description":"File path relative to the memory root, such as MEMORY.md, notes/checkout.md, or org/rules.md (org/ is shared by every project)","schema":{"maxLength":300,"type":"string"}}},"required":["path","content"],"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/agent/memory/search":{"get":{"operationId":"agent.searchMemory","summary":"Search the Squasher Agent's memory files like grep -i (a regular expression, or plain text when it is not valid); returns matching lines with their file","description":"Search the Squasher Agent's memory files like grep -i (a regular expression, or plain text when it is not valid); returns matching lines with their file","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"q","in":"query","required":true,"description":"Pattern to search for","schema":{"maxLength":200,"minLength":1,"type":"string"}},{"name":"path","in":"query","required":false,"description":"Only search files under this path prefix","schema":{"maxLength":300,"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/agent/memory/commits":{"get":{"operationId":"agent.listMemoryCommits","summary":"List recent changes to the Squasher Agent's memory, newest first: who changed it (a person, the agent, or the daily review) and each note before and after","description":"List recent changes to the Squasher Agent's memory, newest first: who changed it (a person, the agent, or the daily review) and each note before and after","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Number of commits (1-100, default 30)","schema":{"maximum":100,"minimum":1,"type":"integer"}},{"name":"path","in":"query","required":false,"description":"Only commits that changed this file","schema":{"maxLength":300,"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/agent/memory/commits/{commit_id}/revert":{"post":{"operationId":"agent.revertMemoryCommit","summary":"Undo one memory commit with a new commit. Notes changed again after that commit are left alone and listed as conflicts","description":"Undo one memory commit with a new commit. Notes changed again after that commit are left alone and listed as conflicts","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"commit_id","in":"path","required":true,"description":"Path parameter commit_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/agent/skills":{"get":{"operationId":"agent.listSkills","summary":"List the skills the Squasher Agent can load for the project: organization and project skills plus the platform skill names","description":"List the skills the Squasher Agent can load for the project: organization and project skills plus the platform skill names","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"agent.upsertSkill","summary":"Create or update a team skill (Agent Skills format) for the project or the whole organization","description":"Create or update a team skill (Agent Skills format) for the project or the whole organization","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/agent/skills/{skill_id}":{"delete":{"operationId":"agent.deleteSkill","summary":"Delete a project or organization skill","description":"Delete a project or organization skill","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"skill_id","in":"path","required":true,"description":"Path parameter skill_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/agent/conversations":{"get":{"operationId":"agent.listConversations","summary":"List recent Squasher Agent conversations (Slack threads, dashboard chats, signal investigations, pull request reviews)","description":"List recent Squasher Agent conversations (Slack threads, dashboard chats, signal investigations, pull request reviews)","tags":["agent"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/automation-templates":{"get":{"operationId":"automations.listTemplates","summary":"List system-owned automation templates available to the project","description":"List system-owned automation templates available to the project","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/automations":{"get":{"operationId":"automations.list","summary":"List enabled, draft, and paused automations for a project","description":"List enabled, draft, and paused automations for a project","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"automations.create","summary":"Create an automation from a template or fully custom config","description":"Create an automation from a template or fully custom config","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/automations/preview":{"post":{"operationId":"automations.preview","summary":"Dry-run a candidate automation config on recent data","description":"Dry-run a candidate automation config on recent data","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/automations/{automation_id}":{"get":{"operationId":"automations.get","summary":"Get a single automation configuration and recent run summary","description":"Get a single automation configuration and recent run summary","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"automation_id","in":"path","required":true,"description":"Path parameter automation_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"automations.update","summary":"Update, pause, resume, or rename an automation","description":"Update, pause, resume, or rename an automation","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"automation_id","in":"path","required":true,"description":"Path parameter automation_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"automations.delete","summary":"Delete an automation and its run history","description":"Delete an automation and its run history","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"automation_id","in":"path","required":true,"description":"Path parameter automation_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/automation-skills":{"get":{"operationId":"automations.listSkills","summary":"List project-scoped automation skills (markdown bundles)","description":"List project-scoped automation skills (markdown bundles)","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"automations.upsertSkill","summary":"Create or update a project-scoped automation skill by name","description":"Create or update a project-scoped automation skill by name","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/automation-skills/{skill_id}":{"get":{"operationId":"automations.getSkill","summary":"Read a single automation skill","description":"Read a single automation skill","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"skill_id","in":"path","required":true,"description":"Path parameter skill_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"delete":{"operationId":"automations.deleteSkill","summary":"Delete a project-scoped automation skill","description":"Delete a project-scoped automation skill","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"skill_id","in":"path","required":true,"description":"Path parameter skill_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/automations/{automation_id}/runs":{"post":{"operationId":"automations.runManual","summary":"Trigger a manual run for an automation","description":"Trigger a manual run for an automation","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"automation_id","in":"path","required":true,"description":"Path parameter automation_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"get":{"operationId":"automations.listRuns","summary":"List recent runs for an automation","description":"List recent runs for an automation","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"automation_id","in":"path","required":true,"description":"Path parameter automation_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/automation-runs/{run_id}":{"get":{"operationId":"automations.getRun","summary":"Get a single run with its steps, outputs, and approvals","description":"Get a single run with its steps, outputs, and approvals","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"run_id","in":"path","required":true,"description":"Path parameter run_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/automation-runs/{run_id}/cancel":{"post":{"operationId":"automations.cancelRun","summary":"Cancel a queued or running automation run","description":"Cancel a queued or running automation run","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"run_id","in":"path","required":true,"description":"Path parameter run_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/automation-runs/{run_id}/outputs":{"get":{"operationId":"automations.listRunOutputs","summary":"List outputs the runner produced for a run","description":"List outputs the runner produced for a run","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"run_id","in":"path","required":true,"description":"Path parameter run_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/automation-runs/{run_id}/approvals":{"get":{"operationId":"automations.listRunApprovals","summary":"List outputs that need approval before they can be emitted","description":"List outputs that need approval before they can be emitted","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"run_id","in":"path","required":true,"description":"Path parameter run_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/automation-runs/{run_id}/outputs/{output_id}/approve":{"post":{"operationId":"automations.approveOutput","summary":"Approve a dangerous automation output and let the runner emit it","description":"Approve a dangerous automation output and let the runner emit it","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"run_id","in":"path","required":true,"description":"Path parameter run_id","schema":{"type":"string"}},{"name":"output_id","in":"path","required":true,"description":"Path parameter output_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/automation-runs/{run_id}/outputs/{output_id}/reject":{"post":{"operationId":"automations.rejectOutput","summary":"Reject an automation output","description":"Reject an automation output","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"run_id","in":"path","required":true,"description":"Path parameter run_id","schema":{"type":"string"}},{"name":"output_id","in":"path","required":true,"description":"Path parameter output_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/automation-capabilities":{"get":{"operationId":"automations.listCapabilities","summary":"List built-in and project-defined automation capability manifests","description":"List built-in and project-defined automation capability manifests","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"automations.createCapability","summary":"Define a project-scoped capability manifest the runner can attach to automations","description":"Define a project-scoped capability manifest the runner can attach to automations","tags":["automations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/notifications/destinations":{"get":{"operationId":"notifications.listDestinations","summary":"List notification destinations (Slack, webhook, email, PagerDuty, Telegram, Microsoft Teams, or on-call escalation) for a project","description":"List notification destinations (Slack, webhook, email, PagerDuty, Telegram, Microsoft Teams, or on-call escalation) for a project","tags":["notifications"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"notifications.createDestination","summary":"Create a notification destination","description":"Create a notification destination","tags":["notifications"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Create one typed destination. Telegram bot tokens and Microsoft Teams webhook URLs are encrypted and write-only.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"label":{"type":"string","minLength":1,"maxLength":255},"config":{"type":"object","properties":{"channelId":{"type":"string","minLength":1},"channelName":{"type":"string","minLength":1}},"required":["channelId","channelName"]},"integrationId":{"type":"string","format":"uuid"}},"required":["type","label","config","integrationId"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"label":{"type":"string","minLength":1,"maxLength":255},"config":{"type":"object","properties":{"url":{"type":"string","format":"uri","pattern":"^https://"},"secret":{"type":"string","minLength":8}},"required":["url"]}},"required":["type","label","config"]},{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"label":{"type":"string","minLength":1,"maxLength":255},"config":{"type":"object","properties":{"recipients":{"type":"array","items":{"type":"string","format":"email"},"minItems":1,"maxItems":20}},"required":["recipients"]}},"required":["type","label","config"]},{"type":"object","properties":{"type":{"type":"string","enum":["pagerduty"]},"label":{"type":"string","minLength":1,"maxLength":255},"config":{"type":"object","properties":{"integrationKey":{"type":"string","minLength":8,"format":"password"},"severityMap":{"type":"object","additionalProperties":{"type":"string","enum":["critical","error","warning","info"]}}},"required":["integrationKey"]}},"required":["type","label","config"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack_war_room"]},"label":{"type":"string","minLength":1,"maxLength":255},"config":{"type":"object","properties":{"namingPrefix":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,15}$"},"inviteUserIds":{"type":"array","items":{"type":"string","minLength":1},"maxItems":50},"inviteUserGroupIds":{"type":"array","items":{"type":"string","minLength":1},"maxItems":20},"archiveOnResolve":{"type":"boolean"}}},"integrationId":{"type":"string","format":"uuid"}},"required":["type","label","config","integrationId"]},{"type":"object","properties":{"type":{"type":"string","enum":["telegram"]},"label":{"type":"string","minLength":1,"maxLength":255},"config":{"type":"object","additionalProperties":false,"properties":{"botToken":{"type":"string","format":"password","minLength":30,"maxLength":256,"pattern":"^[0-9]+:[A-Za-z0-9_-]+$"},"chatId":{"type":"string","pattern":"^(?:-?[1-9][0-9]{0,15}|@[A-Za-z][A-Za-z0-9_]{4,31})$"},"messageThreadId":{"type":"integer","minimum":1,"maximum":2147483647}},"required":["botToken","chatId"]}},"required":["type","label","config"]},{"type":"object","properties":{"type":{"type":"string","enum":["teams"]},"label":{"type":"string","minLength":1,"maxLength":255},"config":{"type":"object","additionalProperties":false,"description":"Post Adaptive Cards to a Microsoft Teams channel through a Teams Workflows webhook URL","properties":{"webhookUrl":{"type":"string","format":"password","maxLength":2048,"description":"HTTPS on port 443, no user name or password, a host under environment.api.powerplatform.com or logic.azure.com, and a workflow path","pattern":"^https://[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*\\.(environment\\.api\\.powerplatform\\.com|logic\\.azure\\.com)(:443)?/[^\\s#]+$"}},"required":["webhookUrl"]}},"required":["type","label","config"]},{"type":"object","properties":{"type":{"type":"string","enum":["oncall_escalation"]},"label":{"type":"string","minLength":1,"maxLength":255},"config":{"type":"object","additionalProperties":false,"description":"Page people by SMS and voice with an enabled on-call escalation policy","properties":{"policyId":{"type":"string","format":"uuid"}},"required":["policyId"]}},"required":["type","label","config"]}]}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/notifications/destinations/{destination_id}":{"delete":{"operationId":"notifications.deleteDestination","summary":"Delete a notification destination","description":"Delete a notification destination","tags":["notifications"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"destination_id","in":"path","required":true,"description":"Path parameter destination_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/notifications/destinations/{destination_id}/test":{"post":{"operationId":"notifications.testDestination","summary":"Send a test notification to the destination by writing a one-off outbox row that the notifications worker dispatches","description":"Send a test notification to the destination by writing a one-off outbox row that the notifications worker dispatches","tags":["notifications"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"destination_id","in":"path","required":true,"description":"Path parameter destination_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/notifications/routes":{"get":{"operationId":"notifications.listRoutes","summary":"List notification routes — scope + conditions + destination IDs","description":"List notification routes — scope + conditions + destination IDs","tags":["notifications"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"notifications.createRoute","summary":"Create a notification route with M:N destinations","description":"Create a notification route with M:N destinations","tags":["notifications"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/notifications/routes/{route_id}/destinations":{"put":{"operationId":"notifications.setRouteDestinations","summary":"Replace the set of destinations attached to a route","description":"Replace the set of destinations attached to a route","tags":["notifications"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"route_id","in":"path","required":true,"description":"Path parameter route_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/notifications/routes/{route_id}":{"delete":{"operationId":"notifications.deleteRoute","summary":"Delete a notification route","description":"Delete a notification route","tags":["notifications"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"route_id","in":"path","required":true,"description":"Path parameter route_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/notifications/deliveries":{"get":{"operationId":"notifications.listDeliveries","summary":"List recent delivery attempts (success + failure) for the project","description":"List recent delivery attempts (success + failure) for the project","tags":["notifications"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/sourcemaps":{"get":{"operationId":"sourcemaps.list","summary":"List uploaded sourcemaps (optionally filter by service and release)","description":"List uploaded sourcemaps (optionally filter by service and release)","tags":["sourcemaps"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"sourcemaps.upload","summary":"Upload sourcemap files for a service release (multipart). At most 200 files, 32 MiB per file, and 96 MiB per request (413 above). File names are relative paths without `.` or `..` segments. A map with a `debugId` is also matched to frames by that ID.","description":"Upload sourcemap files for a service release (multipart). At most 200 files, 32 MiB per file, and 96 MiB per request (413 above). File names are relative paths without `.` or `..` segments. A map with a `debugId` is also matched to frames by that ID.","tags":["sourcemaps"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/sourcemaps/{sourcemap_id}":{"delete":{"operationId":"sourcemaps.delete","summary":"Delete a sourcemap by ID","description":"Delete a sourcemap by ID","tags":["sourcemaps"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"sourcemap_id","in":"path","required":true,"description":"Path parameter sourcemap_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/sourcemaps/symbolicate":{"post":{"operationId":"sourcemaps.symbolicate","summary":"Resolve minified JavaScript stack frames to the original file, line, column, and function with the project's uploaded source maps (matched by frame debug ID, else by release and file name). Returns lines of original source when the map embeds them, and for each frame that keeps its minified location, the reason. Reads only. Body: { release, service_name, frames: [{ filename, lineno, colno, function, debug_id }] }","description":"Resolve minified JavaScript stack frames to the original file, line, column, and function with the project's uploaded source maps (matched by frame debug ID, else by release and file name). Returns lines of original source when the map embeds them, and for each frame that keeps its minified location, the reason. Reads only. Body: { release, service_name, frames: [{ filename, lineno, colno, function, debug_id }] }","tags":["sourcemaps"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"context_lines":{"maximum":10,"minimum":0,"type":"integer"},"frames":{"items":{"additionalProperties":false,"properties":{"colno":{"type":["integer","null"],"description":"1-based column in the minified file."},"debug_id":{"type":["string","null"],"description":"Debug ID of the frame's file, if known."},"filename":{"minLength":1,"type":"string"},"function":{"type":["string","null"]},"in_app":{"type":["boolean","null"]},"lineno":{"type":["integer","null"],"description":"1-based line in the minified file."}},"required":["filename"],"type":"object"},"maxItems":100,"minItems":1,"type":"array"},"release":{"type":["string","null"],"description":"The event release (service.version)."},"service_name":{"type":["string","null"]}},"required":["frames"],"type":"object"}}}},"responses":{"200":{"description":"Frames in request order","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"frames":{"items":{"additionalProperties":false,"properties":{"hint":{"type":["string","null"]},"original":{"additionalProperties":false,"properties":{"colno":{"type":["integer","null"]},"context":{"additionalProperties":false,"properties":{"line":{"type":"string"},"post":{"items":{"type":"string"},"type":"array"},"pre":{"items":{"type":"string"},"type":"array"}},"required":["line","post","pre"],"type":["object","null"]},"filename":{"type":"string"},"function":{"type":["string","null"]},"lineno":{"type":"integer"}},"required":["colno","context","filename","function","lineno"],"type":["object","null"]},"raw":{"additionalProperties":false,"properties":{"colno":{"type":["integer","null"],"description":"1-based column in the minified file."},"debug_id":{"type":["string","null"],"description":"Debug ID of the frame's file, if known."},"filename":{"minLength":1,"type":"string"},"function":{"type":["string","null"]},"in_app":{"type":["boolean","null"]},"lineno":{"type":["integer","null"],"description":"1-based line in the minified file."}},"required":["filename"],"type":"object"},"reason":{"enum":[null,"missing_position","no_release","no_source_map","no_matching_file","map_too_large","map_unreadable","no_mapping","storage_unavailable"],"type":["string","null"]},"source_map":{"additionalProperties":false,"properties":{"filename":{"type":"string"},"id":{"type":"string"},"matched_by":{"enum":["debug_id","filename"],"type":"string"},"release":{"type":"string"}},"required":["filename","id","matched_by","release"],"type":["object","null"]},"status":{"enum":["symbolicated","unchanged"],"type":"string"}},"required":["hint","original","raw","reason","source_map","status"],"type":"object"},"type":"array"},"summary":{"additionalProperties":false,"properties":{"symbolicated":{"type":"integer"},"total":{"type":"integer"}},"required":["symbolicated","total"],"type":"object"}},"required":["frames","summary"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/grouping-rules":{"get":{"operationId":"groupingRules.list","summary":"List the project's error grouping rules in evaluation order. Ingest applies the first enabled rule that matches each new error event.","description":"List the project's error grouping rules in evaluation order. Ingest applies the first enabled rule that matches each new error event.","tags":["groupingRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Rules in order","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"limit":{"type":"integer"},"rules":{"items":{"additionalProperties":false,"properties":{"action":{"description":"fingerprint: hash a template; stack_frames: hash the top in-app frames; merge_into: join an existing issue.","enum":["fingerprint","stack_frames","merge_into"],"type":"string"},"created_at":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"fingerprint_template":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every error.","properties":{"exception_type":{"type":["string","null"],"description":"Exact error.type or exception.type."},"frame_path":{"type":["string","null"],"description":"Text a stack frame path or module contains."},"message_regex":{"type":["string","null"],"description":"RE2 pattern searched in the first line of the message. No lookaround or backreferences.","maxLength":256},"service":{"type":["string","null"],"description":"Exact service.name."},"tags":{"additionalProperties":{"type":"string"},"description":"Attribute key to exact value.","maxProperties":10,"type":"object"}},"type":"object"},"merge_into":{"additionalProperties":false,"properties":{"fingerprint":{"type":"string"},"issue_id":{"format":"uuid","type":"string"},"short_id":{"type":["string","null"]}},"required":["fingerprint","issue_id","short_id"],"type":["object","null"]},"name":{"type":"string"},"position":{"type":"integer"},"stack_frame_count":{"type":["integer","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["action","created_at","enabled","fingerprint_template","id","match","merge_into","name","position","stack_frame_count","updated_at"],"type":"object"},"type":"array"}},"required":["limit","rules"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"groupingRules.create","summary":"Add an error grouping rule. It applies to new error events within about a minute; existing issues keep their fingerprint. At most 50 rules per project. Try rules first with groupingRules.preview. Body: { name, match, action, fingerprint_template | stack_frame_count | merge_into_issue_id }","description":"Add an error grouping rule. It applies to new error events within about a minute; existing issues keep their fingerprint. At most 50 rules per project. Try rules first with groupingRules.preview. Body: { name, match, action, fingerprint_template | stack_frame_count | merge_into_issue_id }","tags":["groupingRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"description":"fingerprint: hash a template; stack_frames: hash the top in-app frames; merge_into: join an existing issue.","enum":["fingerprint","stack_frames","merge_into"],"type":"string"},"enabled":{"type":"boolean"},"fingerprint_template":{"type":["string","null"],"description":"For fingerprint: text with {{ error.type }}, {{ service.name }}, {{ message }}, {{ frame.file }}, {{ frame.function }}, {{ tags.<attribute> }}.","maxLength":512},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every error.","properties":{"exception_type":{"type":["string","null"],"description":"Exact error.type or exception.type."},"frame_path":{"type":["string","null"],"description":"Text a stack frame path or module contains."},"message_regex":{"type":["string","null"],"description":"RE2 pattern searched in the first line of the message. No lookaround or backreferences.","maxLength":256},"service":{"type":["string","null"],"description":"Exact service.name."},"tags":{"additionalProperties":{"type":"string"},"description":"Attribute key to exact value.","maxProperties":10,"type":"object"}},"type":"object"},"merge_into_issue_id":{"type":["string","null"],"description":"For merge_into: the issue id or short id (iss_42)."},"name":{"maxLength":120,"minLength":1,"type":"string"},"position":{"description":"Where to put the rule. Default: last.","minimum":0,"type":"integer"},"stack_frame_count":{"maximum":10,"minimum":1,"type":["integer","null"]}},"required":["action","name"],"type":"object"}}}},"responses":{"201":{"description":"Created rule","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"rule":{"additionalProperties":false,"properties":{"action":{"description":"fingerprint: hash a template; stack_frames: hash the top in-app frames; merge_into: join an existing issue.","enum":["fingerprint","stack_frames","merge_into"],"type":"string"},"created_at":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"fingerprint_template":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every error.","properties":{"exception_type":{"type":["string","null"],"description":"Exact error.type or exception.type."},"frame_path":{"type":["string","null"],"description":"Text a stack frame path or module contains."},"message_regex":{"type":["string","null"],"description":"RE2 pattern searched in the first line of the message. No lookaround or backreferences.","maxLength":256},"service":{"type":["string","null"],"description":"Exact service.name."},"tags":{"additionalProperties":{"type":"string"},"description":"Attribute key to exact value.","maxProperties":10,"type":"object"}},"type":"object"},"merge_into":{"additionalProperties":false,"properties":{"fingerprint":{"type":"string"},"issue_id":{"format":"uuid","type":"string"},"short_id":{"type":["string","null"]}},"required":["fingerprint","issue_id","short_id"],"type":["object","null"]},"name":{"type":"string"},"position":{"type":"integer"},"stack_frame_count":{"type":["integer","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["action","created_at","enabled","fingerprint_template","id","match","merge_into","name","position","stack_frame_count","updated_at"],"type":"object"}},"required":["rule"],"type":"object"}}}},"409":{"description":"The project already has the most rules it can have","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/grouping-rules/{rule_id}":{"patch":{"operationId":"groupingRules.update","summary":"Change an error grouping rule: its conditions, action, enabled state, or position. Set fields change; `match` fields merge.","description":"Change an error grouping rule: its conditions, action, enabled state, or position. Set fields change; `match` fields merge.","tags":["groupingRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"rule_id","in":"path","required":true,"description":"Rule id from groupingRules.list.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"description":"fingerprint: hash a template; stack_frames: hash the top in-app frames; merge_into: join an existing issue.","enum":["fingerprint","stack_frames","merge_into"],"type":"string"},"enabled":{"type":"boolean"},"fingerprint_template":{"type":["string","null"],"description":"For fingerprint: text with {{ error.type }}, {{ service.name }}, {{ message }}, {{ frame.file }}, {{ frame.function }}, {{ tags.<attribute> }}.","maxLength":512},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every error.","properties":{"exception_type":{"type":["string","null"],"description":"Exact error.type or exception.type."},"frame_path":{"type":["string","null"],"description":"Text a stack frame path or module contains."},"message_regex":{"type":["string","null"],"description":"RE2 pattern searched in the first line of the message. No lookaround or backreferences.","maxLength":256},"service":{"type":["string","null"],"description":"Exact service.name."},"tags":{"additionalProperties":{"type":"string"},"description":"Attribute key to exact value.","maxProperties":10,"type":"object"}},"type":"object"},"merge_into_issue_id":{"type":["string","null"],"description":"For merge_into: the issue id or short id (iss_42)."},"name":{"maxLength":120,"minLength":1,"type":"string"},"position":{"description":"Where to put the rule. Default: last.","minimum":0,"type":"integer"},"stack_frame_count":{"maximum":10,"minimum":1,"type":["integer","null"]}},"type":"object"}}}},"responses":{"200":{"description":"Updated rule","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"rule":{"additionalProperties":false,"properties":{"action":{"description":"fingerprint: hash a template; stack_frames: hash the top in-app frames; merge_into: join an existing issue.","enum":["fingerprint","stack_frames","merge_into"],"type":"string"},"created_at":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"fingerprint_template":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every error.","properties":{"exception_type":{"type":["string","null"],"description":"Exact error.type or exception.type."},"frame_path":{"type":["string","null"],"description":"Text a stack frame path or module contains."},"message_regex":{"type":["string","null"],"description":"RE2 pattern searched in the first line of the message. No lookaround or backreferences.","maxLength":256},"service":{"type":["string","null"],"description":"Exact service.name."},"tags":{"additionalProperties":{"type":"string"},"description":"Attribute key to exact value.","maxProperties":10,"type":"object"}},"type":"object"},"merge_into":{"additionalProperties":false,"properties":{"fingerprint":{"type":"string"},"issue_id":{"format":"uuid","type":"string"},"short_id":{"type":["string","null"]}},"required":["fingerprint","issue_id","short_id"],"type":["object","null"]},"name":{"type":"string"},"position":{"type":"integer"},"stack_frame_count":{"type":["integer","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["action","created_at","enabled","fingerprint_template","id","match","merge_into","name","position","stack_frame_count","updated_at"],"type":"object"}},"required":["rule"],"type":"object"}}}},"404":{"description":"No rule of this project has this id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"groupingRules.delete","summary":"Remove an error grouping rule. New events then group by the next matching rule.","description":"Remove an error grouping rule. New events then group by the next matching rule.","tags":["groupingRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"rule_id","in":"path","required":true,"description":"Rule id from groupingRules.list.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Rule removed","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"deleted":{"enum":[true],"type":"boolean"}},"required":["deleted"],"type":"object"}}}},"404":{"description":"No rule of this project has this id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/grouping-rules/preview":{"post":{"operationId":"groupingRules.preview","summary":"Dry run: regroup recent error events (default 200, at most 1000, default last 7 days) with the saved rules or with draft rules, and return the resulting groups, the events each rule matched, and how many events would change issue. Writes nothing. Body: { rules?, limit?, hours? }","description":"Dry run: regroup recent error events (default 200, at most 1000, default last 7 days) with the saved rules or with draft rules, and return the resulting groups, the events each rule matched, and how many events would change issue. Writes nothing. Body: { rules?, limit?, hours? }","tags":["groupingRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"hours":{"maximum":720,"minimum":1,"type":"integer"},"limit":{"maximum":1000,"minimum":1,"type":"integer"},"rules":{"items":{"additionalProperties":false,"properties":{"action":{"description":"fingerprint: hash a template; stack_frames: hash the top in-app frames; merge_into: join an existing issue.","enum":["fingerprint","stack_frames","merge_into"],"type":"string"},"enabled":{"type":"boolean"},"fingerprint_template":{"type":["string","null"],"description":"For fingerprint: text with {{ error.type }}, {{ service.name }}, {{ message }}, {{ frame.file }}, {{ frame.function }}, {{ tags.<attribute> }}.","maxLength":512},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every error.","properties":{"exception_type":{"type":["string","null"],"description":"Exact error.type or exception.type."},"frame_path":{"type":["string","null"],"description":"Text a stack frame path or module contains."},"message_regex":{"type":["string","null"],"description":"RE2 pattern searched in the first line of the message. No lookaround or backreferences.","maxLength":256},"service":{"type":["string","null"],"description":"Exact service.name."},"tags":{"additionalProperties":{"type":"string"},"description":"Attribute key to exact value.","maxProperties":10,"type":"object"}},"type":"object"},"merge_into_issue_id":{"type":["string","null"],"description":"For merge_into: the issue id or short id (iss_42)."},"name":{"maxLength":120,"minLength":1,"type":"string"},"position":{"description":"Where to put the rule. Default: last.","minimum":0,"type":"integer"},"stack_frame_count":{"maximum":10,"minimum":1,"type":["integer","null"]},"id":{"type":"string"}},"required":["action","name"],"type":"object"},"maxItems":50,"type":"array"}},"type":"object"}}}},"responses":{"200":{"description":"Groups the rules would produce"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/ingest-rules":{"get":{"operationId":"ingestRules.list","summary":"List the project's ingest rules in evaluation order, each with what it matched, dropped, and kept over the last 7 days and the monthly saving. Ingest applies the first enabled rule that matches each log, span, or metric point.","description":"List the project's ingest rules in evaluation order, each with what it matched, dropped, and kept over the last 7 days and the monthly saving. Ingest applies the first enabled rule that matches each log, span, or metric point.","tags":["ingestRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Rules in order","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"rules":{"items":{"additionalProperties":false,"properties":{"action":{"description":"drop: matched rows are not stored or billed. sample: keep samplePercent % of them.","enum":["drop","sample"],"type":"string"},"createdAt":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"id":{"format":"uuid","type":"string"},"includeErrors":{"type":"boolean"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every row of its signal.","properties":{"attributes":{"description":"At most 10. The key is looked up in resource attributes, then record attributes; a missing key does not match.","items":{"additionalProperties":false,"properties":{"key":{"maxLength":255,"minLength":1,"type":"string"},"op":{"description":"eq: exact text. regex: RE2 search, no lookaround or backreferences.","enum":["eq","regex"],"type":"string"},"value":{"maxLength":256,"type":"string"}},"required":["key","op","value"],"type":"object"},"maxItems":10,"type":"array"},"metricName":{"type":["string","null"],"description":"Metrics only: exact metric name, or a prefix when it ends with *."},"service":{"type":["string","null"],"description":"Exact service.name."},"severities":{"description":"Logs only. Empty matches every severity.","items":{"enum":["trace","debug","info","warn","error","fatal"],"type":"string"},"type":"array"},"spanName":{"type":["string","null"],"description":"Traces only: exact normalized http.route or span name."}},"type":"object"},"measured":{"additionalProperties":false,"description":"What the rule did over the last 7 days (billing bytes).","properties":{"droppedBytes":{"type":"integer"},"droppedRows":{"type":"integer"},"keptBytes":{"type":"integer"},"keptRows":{"type":"integer"},"matchedBytes":{"type":"integer"},"matchedRows":{"type":"integer"},"saving":{"additionalProperties":false,"description":"Monthly saving from the plan prices. Dropped data is not billed: ingestCents is the telemetry charge of the projected month minus the charge without the dropped bytes (0 under the allowance); storageCents is an estimate.","properties":{"droppedBytesPerMonth":{"type":"integer"},"includedBytes":{"type":"integer"},"ingestCents":{"type":"integer"},"note":{"type":["string","null"]},"planId":{"type":"string"},"projectedMonthBytes":{"type":"integer"},"storageCents":{"type":"integer"},"storageIsEstimate":{"enum":[true],"type":"boolean"},"totalCents":{"type":"integer"}},"required":["droppedBytesPerMonth","includedBytes","ingestCents","note","planId","projectedMonthBytes","storageCents","storageIsEstimate","totalCents"],"type":"object"},"windowDays":{"enum":[7],"type":"integer"}},"required":["droppedBytes","droppedRows","keptBytes","keptRows","matchedBytes","matchedRows","saving","windowDays"],"type":"object"},"name":{"type":"string"},"position":{"type":"integer"},"projectId":{"format":"uuid","type":"string"},"samplePercent":{"type":["integer","null"]},"signal":{"enum":["logs","traces","metrics"],"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["action","createdAt","enabled","id","includeErrors","match","measured","name","position","projectId","samplePercent","signal","updatedAt"],"type":"object"},"type":"array"}},"required":["rules"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"ingestRules.create","summary":"Add an ingest rule that drops or samples logs, spans, or metric points before storage. Dropped data is not stored and not billed. It applies within about 60 seconds. At most 100 rules per project. Try it first with ingestRules.preview. Body: { name, signal, action, samplePercent?, match?, includeErrors? }","description":"Add an ingest rule that drops or samples logs, spans, or metric points before storage. Dropped data is not stored and not billed. It applies within about 60 seconds. At most 100 rules per project. Try it first with ingestRules.preview. Body: { name, signal, action, samplePercent?, match?, includeErrors? }","tags":["ingestRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"description":"drop: matched rows are not stored or billed. sample: keep samplePercent % of them.","enum":["drop","sample"],"type":"string"},"enabled":{"type":"boolean"},"includeErrors":{"description":"Default false: error spans and error logs are kept even when the rule matches.","type":"boolean"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every row of its signal.","properties":{"attributes":{"description":"At most 10. The key is looked up in resource attributes, then record attributes; a missing key does not match.","items":{"additionalProperties":false,"properties":{"key":{"maxLength":255,"minLength":1,"type":"string"},"op":{"description":"eq: exact text. regex: RE2 search, no lookaround or backreferences.","enum":["eq","regex"],"type":"string"},"value":{"maxLength":256,"type":"string"}},"required":["key","op","value"],"type":"object"},"maxItems":10,"type":"array"},"metricName":{"type":["string","null"],"description":"Metrics only: exact metric name, or a prefix when it ends with *."},"service":{"type":["string","null"],"description":"Exact service.name."},"severities":{"description":"Logs only. Empty matches every severity.","items":{"enum":["trace","debug","info","warn","error","fatal"],"type":"string"},"type":"array"},"spanName":{"type":["string","null"],"description":"Traces only: exact normalized http.route or span name."}},"type":"object"},"name":{"maxLength":120,"minLength":1,"type":"string"},"position":{"description":"Where to put the rule. Default: last.","minimum":0,"type":"integer"},"samplePercent":{"description":"For sample: the share of matched rows to keep, 0 to 100.","maximum":100,"minimum":0,"type":["integer","null"]},"signal":{"enum":["logs","traces","metrics"],"type":"string"}},"required":["action","name","signal"],"type":"object"}}}},"responses":{"201":{"description":"Created rule","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"description":"drop: matched rows are not stored or billed. sample: keep samplePercent % of them.","enum":["drop","sample"],"type":"string"},"createdAt":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"id":{"format":"uuid","type":"string"},"includeErrors":{"type":"boolean"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every row of its signal.","properties":{"attributes":{"description":"At most 10. The key is looked up in resource attributes, then record attributes; a missing key does not match.","items":{"additionalProperties":false,"properties":{"key":{"maxLength":255,"minLength":1,"type":"string"},"op":{"description":"eq: exact text. regex: RE2 search, no lookaround or backreferences.","enum":["eq","regex"],"type":"string"},"value":{"maxLength":256,"type":"string"}},"required":["key","op","value"],"type":"object"},"maxItems":10,"type":"array"},"metricName":{"type":["string","null"],"description":"Metrics only: exact metric name, or a prefix when it ends with *."},"service":{"type":["string","null"],"description":"Exact service.name."},"severities":{"description":"Logs only. Empty matches every severity.","items":{"enum":["trace","debug","info","warn","error","fatal"],"type":"string"},"type":"array"},"spanName":{"type":["string","null"],"description":"Traces only: exact normalized http.route or span name."}},"type":"object"},"measured":{"additionalProperties":false,"description":"What the rule did over the last 7 days (billing bytes).","properties":{"droppedBytes":{"type":"integer"},"droppedRows":{"type":"integer"},"keptBytes":{"type":"integer"},"keptRows":{"type":"integer"},"matchedBytes":{"type":"integer"},"matchedRows":{"type":"integer"},"saving":{"additionalProperties":false,"description":"Monthly saving from the plan prices. Dropped data is not billed: ingestCents is the telemetry charge of the projected month minus the charge without the dropped bytes (0 under the allowance); storageCents is an estimate.","properties":{"droppedBytesPerMonth":{"type":"integer"},"includedBytes":{"type":"integer"},"ingestCents":{"type":"integer"},"note":{"type":["string","null"]},"planId":{"type":"string"},"projectedMonthBytes":{"type":"integer"},"storageCents":{"type":"integer"},"storageIsEstimate":{"enum":[true],"type":"boolean"},"totalCents":{"type":"integer"}},"required":["droppedBytesPerMonth","includedBytes","ingestCents","note","planId","projectedMonthBytes","storageCents","storageIsEstimate","totalCents"],"type":"object"},"windowDays":{"enum":[7],"type":"integer"}},"required":["droppedBytes","droppedRows","keptBytes","keptRows","matchedBytes","matchedRows","saving","windowDays"],"type":"object"},"name":{"type":"string"},"position":{"type":"integer"},"projectId":{"format":"uuid","type":"string"},"samplePercent":{"type":["integer","null"]},"signal":{"enum":["logs","traces","metrics"],"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["action","createdAt","enabled","id","includeErrors","match","measured","name","position","projectId","samplePercent","signal","updatedAt"],"type":"object"}}}},"409":{"description":"The project already has the most rules it can have","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/ingest-rules/{rule_id}":{"patch":{"operationId":"ingestRules.update","summary":"Change an ingest rule: its conditions, action, sample percent, error protection, enabled state, or position. Set fields change; `match` fields merge. Applies within about 60 seconds.","description":"Change an ingest rule: its conditions, action, sample percent, error protection, enabled state, or position. Set fields change; `match` fields merge. Applies within about 60 seconds.","tags":["ingestRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"rule_id","in":"path","required":true,"description":"Rule id from ingestRules.list.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"description":"drop: matched rows are not stored or billed. sample: keep samplePercent % of them.","enum":["drop","sample"],"type":"string"},"enabled":{"type":"boolean"},"includeErrors":{"description":"Default false: error spans and error logs are kept even when the rule matches.","type":"boolean"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every row of its signal.","properties":{"attributes":{"description":"At most 10. The key is looked up in resource attributes, then record attributes; a missing key does not match.","items":{"additionalProperties":false,"properties":{"key":{"maxLength":255,"minLength":1,"type":"string"},"op":{"description":"eq: exact text. regex: RE2 search, no lookaround or backreferences.","enum":["eq","regex"],"type":"string"},"value":{"maxLength":256,"type":"string"}},"required":["key","op","value"],"type":"object"},"maxItems":10,"type":"array"},"metricName":{"type":["string","null"],"description":"Metrics only: exact metric name, or a prefix when it ends with *."},"service":{"type":["string","null"],"description":"Exact service.name."},"severities":{"description":"Logs only. Empty matches every severity.","items":{"enum":["trace","debug","info","warn","error","fatal"],"type":"string"},"type":"array"},"spanName":{"type":["string","null"],"description":"Traces only: exact normalized http.route or span name."}},"type":"object"},"name":{"maxLength":120,"minLength":1,"type":"string"},"position":{"description":"Where to put the rule. Default: last.","minimum":0,"type":"integer"},"samplePercent":{"description":"For sample: the share of matched rows to keep, 0 to 100.","maximum":100,"minimum":0,"type":["integer","null"]},"signal":{"enum":["logs","traces","metrics"],"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"Updated rule","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"description":"drop: matched rows are not stored or billed. sample: keep samplePercent % of them.","enum":["drop","sample"],"type":"string"},"createdAt":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"id":{"format":"uuid","type":"string"},"includeErrors":{"type":"boolean"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every row of its signal.","properties":{"attributes":{"description":"At most 10. The key is looked up in resource attributes, then record attributes; a missing key does not match.","items":{"additionalProperties":false,"properties":{"key":{"maxLength":255,"minLength":1,"type":"string"},"op":{"description":"eq: exact text. regex: RE2 search, no lookaround or backreferences.","enum":["eq","regex"],"type":"string"},"value":{"maxLength":256,"type":"string"}},"required":["key","op","value"],"type":"object"},"maxItems":10,"type":"array"},"metricName":{"type":["string","null"],"description":"Metrics only: exact metric name, or a prefix when it ends with *."},"service":{"type":["string","null"],"description":"Exact service.name."},"severities":{"description":"Logs only. Empty matches every severity.","items":{"enum":["trace","debug","info","warn","error","fatal"],"type":"string"},"type":"array"},"spanName":{"type":["string","null"],"description":"Traces only: exact normalized http.route or span name."}},"type":"object"},"measured":{"additionalProperties":false,"description":"What the rule did over the last 7 days (billing bytes).","properties":{"droppedBytes":{"type":"integer"},"droppedRows":{"type":"integer"},"keptBytes":{"type":"integer"},"keptRows":{"type":"integer"},"matchedBytes":{"type":"integer"},"matchedRows":{"type":"integer"},"saving":{"additionalProperties":false,"description":"Monthly saving from the plan prices. Dropped data is not billed: ingestCents is the telemetry charge of the projected month minus the charge without the dropped bytes (0 under the allowance); storageCents is an estimate.","properties":{"droppedBytesPerMonth":{"type":"integer"},"includedBytes":{"type":"integer"},"ingestCents":{"type":"integer"},"note":{"type":["string","null"]},"planId":{"type":"string"},"projectedMonthBytes":{"type":"integer"},"storageCents":{"type":"integer"},"storageIsEstimate":{"enum":[true],"type":"boolean"},"totalCents":{"type":"integer"}},"required":["droppedBytesPerMonth","includedBytes","ingestCents","note","planId","projectedMonthBytes","storageCents","storageIsEstimate","totalCents"],"type":"object"},"windowDays":{"enum":[7],"type":"integer"}},"required":["droppedBytes","droppedRows","keptBytes","keptRows","matchedBytes","matchedRows","saving","windowDays"],"type":"object"},"name":{"type":"string"},"position":{"type":"integer"},"projectId":{"format":"uuid","type":"string"},"samplePercent":{"type":["integer","null"]},"signal":{"enum":["logs","traces","metrics"],"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["action","createdAt","enabled","id","includeErrors","match","measured","name","position","projectId","samplePercent","signal","updatedAt"],"type":"object"}}}},"404":{"description":"No rule of this project has this id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"ingestRules.delete","summary":"Remove an ingest rule. Within about 60 seconds, ingest stores the rows it matched again (or the next matching rule applies).","description":"Remove an ingest rule. Within about 60 seconds, ingest stores the rows it matched again (or the next matching rule applies).","tags":["ingestRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"rule_id","in":"path","required":true,"description":"Rule id from ingestRules.list.","schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"description":"Rule removed"},"404":{"description":"No rule of this project has this id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/ingest-rules/reorder":{"post":{"operationId":"ingestRules.reorder","summary":"Set the evaluation order. Body: { ruleIds } with every rule id of the project exactly once, first rule first.","description":"Set the evaluation order. Body: { ruleIds } with every rule id of the project exactly once, first rule first.","tags":["ingestRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"ruleIds":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array"}},"required":["ruleIds"],"type":"object"}}}},"responses":{"200":{"description":"Rules in the new order","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"rules":{"items":{"additionalProperties":false,"properties":{"action":{"description":"drop: matched rows are not stored or billed. sample: keep samplePercent % of them.","enum":["drop","sample"],"type":"string"},"createdAt":{"format":"date-time","type":"string"},"enabled":{"type":"boolean"},"id":{"format":"uuid","type":"string"},"includeErrors":{"type":"boolean"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every row of its signal.","properties":{"attributes":{"description":"At most 10. The key is looked up in resource attributes, then record attributes; a missing key does not match.","items":{"additionalProperties":false,"properties":{"key":{"maxLength":255,"minLength":1,"type":"string"},"op":{"description":"eq: exact text. regex: RE2 search, no lookaround or backreferences.","enum":["eq","regex"],"type":"string"},"value":{"maxLength":256,"type":"string"}},"required":["key","op","value"],"type":"object"},"maxItems":10,"type":"array"},"metricName":{"type":["string","null"],"description":"Metrics only: exact metric name, or a prefix when it ends with *."},"service":{"type":["string","null"],"description":"Exact service.name."},"severities":{"description":"Logs only. Empty matches every severity.","items":{"enum":["trace","debug","info","warn","error","fatal"],"type":"string"},"type":"array"},"spanName":{"type":["string","null"],"description":"Traces only: exact normalized http.route or span name."}},"type":"object"},"measured":{"additionalProperties":false,"description":"What the rule did over the last 7 days (billing bytes).","properties":{"droppedBytes":{"type":"integer"},"droppedRows":{"type":"integer"},"keptBytes":{"type":"integer"},"keptRows":{"type":"integer"},"matchedBytes":{"type":"integer"},"matchedRows":{"type":"integer"},"saving":{"additionalProperties":false,"description":"Monthly saving from the plan prices. Dropped data is not billed: ingestCents is the telemetry charge of the projected month minus the charge without the dropped bytes (0 under the allowance); storageCents is an estimate.","properties":{"droppedBytesPerMonth":{"type":"integer"},"includedBytes":{"type":"integer"},"ingestCents":{"type":"integer"},"note":{"type":["string","null"]},"planId":{"type":"string"},"projectedMonthBytes":{"type":"integer"},"storageCents":{"type":"integer"},"storageIsEstimate":{"enum":[true],"type":"boolean"},"totalCents":{"type":"integer"}},"required":["droppedBytesPerMonth","includedBytes","ingestCents","note","planId","projectedMonthBytes","storageCents","storageIsEstimate","totalCents"],"type":"object"},"windowDays":{"enum":[7],"type":"integer"}},"required":["droppedBytes","droppedRows","keptBytes","keptRows","matchedBytes","matchedRows","saving","windowDays"],"type":"object"},"name":{"type":"string"},"position":{"type":"integer"},"projectId":{"format":"uuid","type":"string"},"samplePercent":{"type":["integer","null"]},"signal":{"enum":["logs","traces","metrics"],"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["action","createdAt","enabled","id","includeErrors","match","measured","name","position","projectId","samplePercent","signal","updatedAt"],"type":"object"},"type":"array"}},"required":["rules"],"type":"object"}}}},"409":{"description":"ruleIds does not name every rule of the project exactly once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/ingest-rules/preview":{"post":{"operationId":"ingestRules.preview","summary":"Dry run of a draft or saved rule: estimated rows and billing bytes it matches over the last 7 days, the share it would drop, and the monthly saving (ingest and estimated storage) from the plan prices. Works on every plan. Writes nothing. Body: the rule input, and ruleId to test a saved rule with changes.","description":"Dry run of a draft or saved rule: estimated rows and billing bytes it matches over the last 7 days, the share it would drop, and the monthly saving (ingest and estimated storage) from the plan prices. Works on every plan. Writes nothing. Body: the rule input, and ruleId to test a saved rule with changes.","tags":["ingestRules"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"action":{"description":"drop: matched rows are not stored or billed. sample: keep samplePercent % of them.","enum":["drop","sample"],"type":"string"},"enabled":{"type":"boolean"},"includeErrors":{"description":"Default false: error spans and error logs are kept even when the rule matches.","type":"boolean"},"match":{"additionalProperties":false,"description":"Every set condition must match. A rule without conditions matches every row of its signal.","properties":{"attributes":{"description":"At most 10. The key is looked up in resource attributes, then record attributes; a missing key does not match.","items":{"additionalProperties":false,"properties":{"key":{"maxLength":255,"minLength":1,"type":"string"},"op":{"description":"eq: exact text. regex: RE2 search, no lookaround or backreferences.","enum":["eq","regex"],"type":"string"},"value":{"maxLength":256,"type":"string"}},"required":["key","op","value"],"type":"object"},"maxItems":10,"type":"array"},"metricName":{"type":["string","null"],"description":"Metrics only: exact metric name, or a prefix when it ends with *."},"service":{"type":["string","null"],"description":"Exact service.name."},"severities":{"description":"Logs only. Empty matches every severity.","items":{"enum":["trace","debug","info","warn","error","fatal"],"type":"string"},"type":"array"},"spanName":{"type":["string","null"],"description":"Traces only: exact normalized http.route or span name."}},"type":"object"},"name":{"maxLength":120,"minLength":1,"type":"string"},"position":{"description":"Where to put the rule. Default: last.","minimum":0,"type":"integer"},"samplePercent":{"description":"For sample: the share of matched rows to keep, 0 to 100.","maximum":100,"minimum":0,"type":["integer","null"]},"signal":{"enum":["logs","traces","metrics"],"type":"string"},"ruleId":{"format":"uuid","type":"string"}},"required":["action","name","signal"],"type":"object"}}}},"responses":{"200":{"description":"Estimated effect of the rule","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"droppedShare":{"maximum":1,"minimum":0,"type":"number"},"matchedBytes":{"type":"integer"},"matchedRows":{"type":"integer"},"saving":{"additionalProperties":false,"description":"Monthly saving from the plan prices. Dropped data is not billed: ingestCents is the telemetry charge of the projected month minus the charge without the dropped bytes (0 under the allowance); storageCents is an estimate.","properties":{"droppedBytesPerMonth":{"type":"integer"},"includedBytes":{"type":"integer"},"ingestCents":{"type":"integer"},"note":{"type":["string","null"]},"planId":{"type":"string"},"projectedMonthBytes":{"type":"integer"},"storageCents":{"type":"integer"},"storageIsEstimate":{"enum":[true],"type":"boolean"},"totalCents":{"type":"integer"}},"required":["droppedBytesPerMonth","includedBytes","ingestCents","note","planId","projectedMonthBytes","storageCents","storageIsEstimate","totalCents"],"type":"object"},"source":{"type":"string"},"windowDays":{"enum":[7],"type":"integer"}},"required":["droppedShare","matchedBytes","matchedRows","saving","source","windowDays"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/api-keys":{"get":{"operationId":"apiKeys.list","summary":"List API keys for a project","description":"List API keys for a project","tags":["apiKeys"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"read"},"post":{"operationId":"apiKeys.create","summary":"Create a project API key","description":"Create a project API key","tags":["apiKeys"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expires_at":{"type":["string","null"],"description":"Optional ISO timestamp after which the key expires."},"label":{"type":"string","description":"Human-readable key label."},"scopes":{"type":"array","items":{"type":"string"},"description":"Permission scopes assigned to the new key."}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/api-keys/{key_id}":{"get":{"operationId":"apiKeys.get","summary":"Get API key metadata by ID","description":"Get API key metadata by ID","tags":["apiKeys"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"key_id","in":"path","required":true,"description":"Path parameter key_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"read"},"patch":{"operationId":"apiKeys.update","summary":"Update API key metadata or scopes","description":"Update API key metadata or scopes","tags":["apiKeys"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"key_id","in":"path","required":true,"description":"Path parameter key_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","description":"Updated human-readable key label."},"scopes":{"type":"array","items":{"type":"string"},"description":"Replacement permission scopes for the key."}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"},"delete":{"operationId":"apiKeys.delete","summary":"Revoke a project API key","description":"Revoke a project API key","tags":["apiKeys"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"key_id","in":"path","required":true,"description":"Path parameter key_id","schema":{"type":"string"}}],"responses":{"204":{"description":"API key revoked"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/github/repos":{"get":{"operationId":"github.listRepos","summary":"List GitHub App installed repos available to a project","description":"List GitHub App installed repos available to a project","tags":["github"],"parameters":[{"name":"project_id","in":"query","required":true,"description":"Query parameter project_id","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/github":{"put":{"operationId":"github.link","summary":"Link one or more GitHub repos to a project","description":"Link one or more GitHub repos to a project","tags":["github"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"github.unlink","summary":"Unlink GitHub repos from a project","description":"Unlink GitHub repos from a project","tags":["github"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/organizations/{organization_id}/ai-provider-key":{"get":{"operationId":"organizations.getAiProviderKey","summary":"Read the organization's own model provider key: provider, last four characters, status, and this month's cost on the key. The key itself is never returned.","description":"Read the organization's own model provider key: provider, last four characters, status, and this month's cost on the key. The key itself is never returned.","tags":["organizations"],"parameters":[{"name":"organization_id","in":"path","required":true,"description":"Organization ID.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"The key status, or null","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"ai_provider_key":{"anyOf":[{"additionalProperties":false,"properties":{"created_at":{"format":"date-time","type":"string"},"last_error":{"description":"Why the provider last refused the key, or null.","type":["string","null"]},"last_error_at":{"format":"date-time","type":["string","null"]},"last_four":{"description":"The last four characters of the key.","type":"string"},"last_verified_at":{"format":"date-time","type":["string","null"]},"month_to_date_cost_usd":{"description":"Model cost that ran on this key in the current UTC month. It does not use AI credits.","minimum":0,"type":"number"},"provider":{"enum":["openrouter"],"type":"string"},"status":{"description":"`failing` after the provider refused the key; a passing test sets `active`.","enum":["active","failing"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["created_at","last_error","last_error_at","last_four","last_verified_at","month_to_date_cost_usd","provider","status","updated_at"],"type":"object"},{"type":"null"}]},"test":{"additionalProperties":false,"properties":{"message":{"type":"string"},"passed":{"type":"boolean"}},"required":["message","passed"],"type":"object"}},"required":["ai_provider_key"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"organizations.setAiProviderKey","summary":"Add or replace the organization's own OpenRouter key. Squasher checks the key with OpenRouter before it saves it, then runs the organization's agent model calls on it; those calls use no AI credits. Owners and admins only, from a signed-in session; API keys cannot change the key.","description":"Add or replace the organization's own OpenRouter key. Squasher checks the key with OpenRouter before it saves it, then runs the organization's agent model calls on it; those calls use no AI credits. Owners and admins only, from a signed-in session; API keys cannot change the key.","tags":["organizations"],"parameters":[{"name":"organization_id","in":"path","required":true,"description":"Organization ID.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"api_key":{"maxLength":512,"minLength":20,"type":"string"},"provider":{"enum":["openrouter"],"type":"string"}},"required":["api_key","provider"],"type":"object"}}}},"responses":{"200":{"description":"The saved key status","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"ai_provider_key":{"anyOf":[{"additionalProperties":false,"properties":{"created_at":{"format":"date-time","type":"string"},"last_error":{"description":"Why the provider last refused the key, or null.","type":["string","null"]},"last_error_at":{"format":"date-time","type":["string","null"]},"last_four":{"description":"The last four characters of the key.","type":"string"},"last_verified_at":{"format":"date-time","type":["string","null"]},"month_to_date_cost_usd":{"description":"Model cost that ran on this key in the current UTC month. It does not use AI credits.","minimum":0,"type":"number"},"provider":{"enum":["openrouter"],"type":"string"},"status":{"description":"`failing` after the provider refused the key; a passing test sets `active`.","enum":["active","failing"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["created_at","last_error","last_error_at","last_four","last_verified_at","month_to_date_cost_usd","provider","status","updated_at"],"type":"object"},{"type":"null"}]},"test":{"additionalProperties":false,"properties":{"message":{"type":"string"},"passed":{"type":"boolean"}},"required":["message","passed"],"type":"object"}},"required":["ai_provider_key"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":true,"x-risk":"dangerous"},"delete":{"operationId":"organizations.deleteAiProviderKey","summary":"Remove the organization's own key. Agent model calls then use Squasher's key and AI credits again. Owners and admins only, from a signed-in session; API keys cannot change the key.","description":"Remove the organization's own key. Agent model calls then use Squasher's key and AI credits again. Owners and admins only, from a signed-in session; API keys cannot change the key.","tags":["organizations"],"parameters":[{"name":"organization_id","in":"path","required":true,"description":"Organization ID.","schema":{"format":"uuid","type":"string"}}],"responses":{"204":{"description":"The key was removed"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":true,"x-risk":"destructive"}},"/v1/organizations/{organization_id}/ai-provider-key/test":{"post":{"operationId":"organizations.testAiProviderKey","summary":"Check the saved key with the provider. A passing test clears a failing status. Owners and admins only, from a signed-in session; API keys cannot change the key.","description":"Check the saved key with the provider. A passing test clears a failing status. Owners and admins only, from a signed-in session; API keys cannot change the key.","tags":["organizations"],"parameters":[{"name":"organization_id","in":"path","required":true,"description":"Organization ID.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"The test result and key status","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"ai_provider_key":{"anyOf":[{"additionalProperties":false,"properties":{"created_at":{"format":"date-time","type":"string"},"last_error":{"description":"Why the provider last refused the key, or null.","type":["string","null"]},"last_error_at":{"format":"date-time","type":["string","null"]},"last_four":{"description":"The last four characters of the key.","type":"string"},"last_verified_at":{"format":"date-time","type":["string","null"]},"month_to_date_cost_usd":{"description":"Model cost that ran on this key in the current UTC month. It does not use AI credits.","minimum":0,"type":"number"},"provider":{"enum":["openrouter"],"type":"string"},"status":{"description":"`failing` after the provider refused the key; a passing test sets `active`.","enum":["active","failing"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["created_at","last_error","last_error_at","last_four","last_verified_at","month_to_date_cost_usd","provider","status","updated_at"],"type":"object"},{"type":"null"}]},"test":{"additionalProperties":false,"properties":{"message":{"type":"string"},"passed":{"type":"boolean"}},"required":["message","passed"],"type":"object"}},"required":["ai_provider_key"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"write"}},"/v1/organizations/{organization_id}/usage":{"get":{"operationId":"organizations.getUsage","summary":"Usage of one month for the organization: per meter the total, the included amount, the overage, the estimated charge, the budget, a daily series, and the share per project. Also the counted-not-billed statistics (error events, AI observations). Telemetry is measured in bytes (`quantity`) and whole GB (`used`). Any member or API key of the organization can read it.","description":"Usage of one month for the organization: per meter the total, the included amount, the overage, the estimated charge, the budget, a daily series, and the share per project. Also the counted-not-billed statistics (error events, AI observations). Telemetry is measured in bytes (`quantity`) and whole GB (`used`). Any member or API key of the organization can read it.","tags":["organizations"],"parameters":[{"name":"organization_id","in":"path","required":true,"description":"Organization ID.","schema":{"format":"uuid","type":"string"}},{"name":"period","in":"query","required":false,"description":"Month as YYYY-MM (UTC). Defaults to the current month. A future month is refused.","schema":{"pattern":"^\\d{4}-\\d{2}$","type":"string"}}],"responses":{"200":{"description":"The usage report","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"as_of":{"format":"date-time","type":"string"},"base_price_cents":{"minimum":0,"type":"integer"},"closed":{"description":"True for a past month.","type":"boolean"},"meters":{"items":{"additionalProperties":false,"properties":{"billing_status":{"description":"`not_billed`: counted and shown, but not charged yet.","enum":["cataloged","not_billed"],"type":"string"},"budget":{"anyOf":[{"additionalProperties":false,"properties":{"allowed_modes":{"items":{"enum":["alert","stop"],"type":"string"},"type":"array"},"amount_cents":{"minimum":0,"type":"integer","description":"Most overage the budget allows each month, in cents."},"custom":{"description":"False when the plan default is in force.","type":"boolean"},"meter":{"enum":["logs","replays","checks","aiCredits","smsAlerts","voiceAlerts","productEvents"],"type":"string"},"mode":{"enum":["alert","stop"],"type":"string","description":"`alert` notifies and overage continues. `stop` refuses new usage when the budget is spent. Monitor checks and phone alerts allow only `alert`; AI credits allow only `stop`."},"spent_cents":{"minimum":0,"type":"integer","description":"Overage this month at the listed rate, in cents."},"state":{"enum":["ok","warning","reached","stopped"],"type":"string"},"stop_at":{"description":"Usage in plan units where a stop budget refuses new usage; null for `alert`.","minimum":0,"type":["integer","null"]},"updated_at":{"format":"date-time","type":["string","null"]},"updated_by":{"description":"User ID of the last editor.","type":["string","null"]}},"required":["allowed_modes","amount_cents","custom","meter","mode","spent_cents","state","stop_at","updated_at","updated_by"],"type":"object"},{"type":"null"}]},"charge_cents":{"minimum":0,"type":"integer","description":"Estimated overage charge this month, in cents."},"daily":{"items":{"additionalProperties":false,"properties":{"by_signal":{"additionalProperties":{"minimum":0,"type":"integer"},"description":"Telemetry bytes per signal (logs, traces, metrics, ai, vitals).","type":"object"},"day":{"description":"UTC day, YYYY-MM-DD.","format":"date","type":"string"},"quantity":{"minimum":0,"type":"integer"}},"required":["day","quantity"],"type":"object"},"type":"array"},"daily_since":{"description":"UTC day, YYYY-MM-DD.","format":"date","type":["string","null"]},"included":{"minimum":0,"type":"integer"},"label":{"type":"string"},"limit":{"additionalProperties":false,"properties":{"at":{"minimum":0,"type":["integer","null"]},"kind":{"enum":["free_cap","budget_stop","none"],"type":"string"},"reached":{"type":"boolean"}},"required":["at","kind","reached"],"type":"object"},"meter":{"enum":["logs","replays","checks","aiCredits","smsAlerts","voiceAlerts","productEvents"],"type":"string"},"overage":{"minimum":0,"type":"integer"},"overage_rate":{"additionalProperties":false,"properties":{"allowed":{"type":"boolean"},"block_size":{"minimum":0,"type":"integer"},"price_cents":{"minimum":0,"type":"integer"}},"required":["allowed","block_size","price_cents"],"type":"object"},"projects":{"items":{"additionalProperties":false,"properties":{"name":{"type":["string","null"]},"project_id":{"description":"Null for organization-level usage.","format":"uuid","type":["string","null"]},"quantity":{"minimum":0,"type":"integer"},"share":{"description":"Share of the month total, 0 to 1.","maximum":1,"minimum":0,"type":"number"},"slug":{"type":["string","null"]}},"required":["name","project_id","quantity","share","slug"],"type":"object"},"type":"array"},"quantity":{"minimum":0,"type":"integer","description":"Month total in base units (bytes for telemetry)."},"unit":{"type":"string"},"used":{"minimum":0,"type":"integer","description":"Month total in plan units (whole GB for telemetry)."}},"required":["billing_status","budget","charge_cents","daily","daily_since","included","label","limit","meter","overage","overage_rate","projects","quantity","unit","used"],"type":"object"},"type":"array"},"organization_id":{"format":"uuid","type":"string"},"period":{"pattern":"^\\d{4}-\\d{2}$","type":"string"},"plan":{"type":"string"},"statistics":{"description":"Counted, never billed: error events and AI observations.","items":{"additionalProperties":false,"properties":{"daily":{"items":{"additionalProperties":false,"properties":{"day":{"description":"UTC day, YYYY-MM-DD.","format":"date","type":"string"},"quantity":{"minimum":0,"type":"integer"}},"required":["day","quantity"],"type":"object"},"type":"array"},"label":{"type":"string"},"projects":{"items":{"additionalProperties":false,"properties":{"name":{"type":["string","null"]},"project_id":{"description":"Null for organization-level usage.","format":"uuid","type":["string","null"]},"quantity":{"minimum":0,"type":"integer"},"share":{"description":"Share of the month total, 0 to 1.","maximum":1,"minimum":0,"type":"number"},"slug":{"type":["string","null"]}},"required":["name","project_id","quantity","share","slug"],"type":"object"},"type":"array"},"statistic":{"enum":["errorEvents","aiObservations"],"type":"string"},"total":{"minimum":0,"type":"integer"}},"required":["daily","label","projects","statistic","total"],"type":"object"},"type":"array"},"storage":{"additionalProperties":false,"properties":{"billing_status":{"description":"`report_only`: measured and estimated, not billed.","enum":["report_only","cataloged"],"type":"string"},"charge_cents":{"minimum":0,"type":"integer","description":"Billed storage charge; 0 while report only."},"current_bytes":{"minimum":0,"type":"integer","description":"Compressed bytes stored in the newest sampled hour."},"daily":{"items":{"additionalProperties":false,"properties":{"by_signal":{"additionalProperties":{"minimum":0,"type":"integer"},"type":"object"},"bytes":{"minimum":0,"type":"integer"},"day":{"description":"UTC day, YYYY-MM-DD.","format":"date","type":"string"}},"required":["by_signal","bytes","day"],"type":"object"},"type":"array"},"estimated_bytes":{"minimum":0,"type":"integer","description":"Part of current_bytes placed by an estimate."},"estimated_charge_cents":{"minimum":0,"type":"integer","description":"Projected month at the listed rate."},"gb_months":{"minimum":0,"type":"number","description":"Average stored GB × elapsed share of the month."},"included_gb_months":{"minimum":0,"type":"number"},"ingested_bytes":{"minimum":0,"type":"integer","description":"Uncompressed telemetry bytes accepted this month."},"overage_gb_months":{"minimum":0,"type":"number"},"overage_rate":{"additionalProperties":false,"properties":{"allowed":{"type":"boolean"},"block_size":{"minimum":0,"type":"number"},"price_cents":{"minimum":0,"type":"number"}},"required":["allowed","block_size","price_cents"],"type":"object"},"period_hours":{"minimum":0,"type":"integer"},"plan":{"type":"string"},"projected_gb_months":{"minimum":0,"type":"number"},"sampled_at":{"format":"date-time","type":["string","null"]},"sampled_hours":{"minimum":0,"type":"integer"},"signals":{"items":{"additionalProperties":false,"properties":{"current_bytes":{"minimum":0,"type":"integer"},"gb_months":{"minimum":0,"type":"number"},"label":{"type":"string"},"signal":{"type":"string"},"source":{"enum":["sqh","clickhouse","mixed"],"type":"string"}},"required":["current_bytes","gb_months","label","signal","source"],"type":"object"},"type":"array"}},"required":["billing_status","charge_cents","current_bytes","daily","estimated_bytes","estimated_charge_cents","gb_months","included_gb_months","ingested_bytes","overage_gb_months","overage_rate","period_hours","plan","projected_gb_months","sampled_at","sampled_hours","signals"],"type":"object"},"usage_charge_cents":{"minimum":0,"type":"integer","description":"Estimated usage charge this month. The invoice is the record."}},"required":["as_of","base_price_cents","closed","meters","organization_id","period","plan","statistics","storage","usage_charge_cents"],"type":"object"}}}},"400":{"description":"Invalid organization ID or period","content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"},"meter":{"type":"string"}},"required":["error"],"type":"object"}}}},"403":{"description":"The credential does not belong to the organization","content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"},"meter":{"type":"string"}},"required":["error"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/organizations/{organization_id}/budgets":{"get":{"operationId":"organizations.listBudgets","summary":"The budget (overage cap) of every meter for this month: amount, mode, spend, and state. Paid plans get a default budget per meter. The Free plan has no budgets (`available: false`): it stops at its included amounts. Any member or API key of the organization can read budgets.","description":"The budget (overage cap) of every meter for this month: amount, mode, spend, and state. Paid plans get a default budget per meter. The Free plan has no budgets (`available: false`): it stops at its included amounts. Any member or API key of the organization can read budgets.","tags":["organizations"],"parameters":[{"name":"organization_id","in":"path","required":true,"description":"Organization ID.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"The budgets","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"available":{"description":"False on the Free plan, which has no budgets.","type":"boolean"},"budgets":{"items":{"additionalProperties":false,"properties":{"allowed_modes":{"items":{"enum":["alert","stop"],"type":"string"},"type":"array"},"amount_cents":{"minimum":0,"type":"integer","description":"Most overage the budget allows each month, in cents."},"custom":{"description":"False when the plan default is in force.","type":"boolean"},"meter":{"enum":["logs","replays","checks","aiCredits","smsAlerts","voiceAlerts","productEvents"],"type":"string"},"mode":{"enum":["alert","stop"],"type":"string","description":"`alert` notifies and overage continues. `stop` refuses new usage when the budget is spent. Monitor checks and phone alerts allow only `alert`; AI credits allow only `stop`."},"spent_cents":{"minimum":0,"type":"integer","description":"Overage this month at the listed rate, in cents."},"state":{"enum":["ok","warning","reached","stopped"],"type":"string"},"stop_at":{"description":"Usage in plan units where a stop budget refuses new usage; null for `alert`.","minimum":0,"type":["integer","null"]},"updated_at":{"format":"date-time","type":["string","null"]},"updated_by":{"description":"User ID of the last editor.","type":["string","null"]}},"required":["allowed_modes","amount_cents","custom","meter","mode","spent_cents","state","stop_at","updated_at","updated_by"],"type":"object"},"type":"array"},"organization_id":{"format":"uuid","type":"string"},"period":{"pattern":"^\\d{4}-\\d{2}$","type":"string"},"plan":{"type":"string"}},"required":["available","budgets","organization_id","period","plan"],"type":"object"}}}},"403":{"description":"The credential does not belong to the organization","content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"},"meter":{"type":"string"}},"required":["error"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"organizations.updateBudgets","summary":"Change one or more budgets in one request. `mode: stop` refuses new usage of that meter when the budget is spent, until the month ends or the budget is raised (within about a minute). Monitor checks and phone alerts allow only `alert`, so monitoring and paging never stop. AI credits allow only `stop`. Owners and billing admins only, from a signed-in session; API keys cannot change budgets.","description":"Change one or more budgets in one request. `mode: stop` refuses new usage of that meter when the budget is spent, until the month ends or the budget is raised (within about a minute). Monitor checks and phone alerts allow only `alert`, so monitoring and paging never stop. AI credits allow only `stop`. Owners and billing admins only, from a signed-in session; API keys cannot change budgets.","tags":["organizations"],"parameters":[{"name":"organization_id","in":"path","required":true,"description":"Organization ID.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"budgets":{"items":{"additionalProperties":false,"properties":{"amount_cents":{"description":"Budget in cents, up to 10000000. Null restores the plan default.","maximum":10000000,"minimum":0,"type":["integer","null"]},"meter":{"enum":["logs","replays","checks","aiCredits","smsAlerts","voiceAlerts","productEvents"],"type":"string"},"mode":{"description":"Omit to use the meter's default mode (`stop` for AI credits, else `alert`).","enum":["alert","stop"],"type":"string"}},"required":["meter","amount_cents"],"type":"object"},"maxItems":7,"minItems":1,"type":"array"}},"required":["budgets"],"type":"object"}}}},"responses":{"200":{"description":"The budgets after the change","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"available":{"description":"False on the Free plan, which has no budgets.","type":"boolean"},"budgets":{"items":{"additionalProperties":false,"properties":{"allowed_modes":{"items":{"enum":["alert","stop"],"type":"string"},"type":"array"},"amount_cents":{"minimum":0,"type":"integer","description":"Most overage the budget allows each month, in cents."},"custom":{"description":"False when the plan default is in force.","type":"boolean"},"meter":{"enum":["logs","replays","checks","aiCredits","smsAlerts","voiceAlerts","productEvents"],"type":"string"},"mode":{"enum":["alert","stop"],"type":"string","description":"`alert` notifies and overage continues. `stop` refuses new usage when the budget is spent. Monitor checks and phone alerts allow only `alert`; AI credits allow only `stop`."},"spent_cents":{"minimum":0,"type":"integer","description":"Overage this month at the listed rate, in cents."},"state":{"enum":["ok","warning","reached","stopped"],"type":"string"},"stop_at":{"description":"Usage in plan units where a stop budget refuses new usage; null for `alert`.","minimum":0,"type":["integer","null"]},"updated_at":{"format":"date-time","type":["string","null"]},"updated_by":{"description":"User ID of the last editor.","type":["string","null"]}},"required":["allowed_modes","amount_cents","custom","meter","mode","spent_cents","state","stop_at","updated_at","updated_by"],"type":"object"},"type":"array"},"organization_id":{"format":"uuid","type":"string"},"period":{"pattern":"^\\d{4}-\\d{2}$","type":"string"},"plan":{"type":"string"}},"required":["available","budgets","organization_id","period","plan"],"type":"object"}}}},"400":{"description":"`invalid_request` or `unknown_meter`","content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"},"meter":{"type":"string"}},"required":["error"],"type":"object"}}}},"403":{"description":"Not an owner or billing admin, or an API key","content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"},"meter":{"type":"string"}},"required":["error"],"type":"object"}}}},"422":{"description":"`mode_not_allowed`, `budgets_unavailable` (Free plan), or `invalid_amount`","content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"},"meter":{"type":"string"}},"required":["error"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"write"}},"/v1/organizations/{organization_id}/costs":{"get":{"operationId":"organizations.getCosts","summary":"Cost of the organization's usage over a range, grouped by service, signal, project, meter, or a resource attribute (`tag:<key>`), with a time series. List cost is usage at the plan rate before the monthly allowance; billed cost is what the plan charges after the allowance, as usage crosses it in time order. Rates come from the pricing catalog. Every plan (Free included) and every purchase channel can call it; any member, OAuth session, or API key of the organization can read it.","description":"Cost of the organization's usage over a range, grouped by service, signal, project, meter, or a resource attribute (`tag:<key>`), with a time series. List cost is usage at the plan rate before the monthly allowance; billed cost is what the plan charges after the allowance, as usage crosses it in time order. Rates come from the pricing catalog. Every plan (Free included) and every purchase channel can call it; any member, OAuth session, or API key of the organization can read it.","tags":["organizations"],"parameters":[{"name":"organization_id","in":"path","required":true,"description":"Organization ID.","schema":{"format":"uuid","type":"string"}},{"name":"from","in":"query","required":false,"description":"Start, ISO 8601 (inclusive). Defaults to the start of the current UTC month.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End, ISO 8601 (exclusive). Defaults to now.","schema":{"format":"date-time","type":"string"}},{"name":"group_by","in":"query","required":false,"description":"`service` (default), `signal`, `project`, `meter`, or `tag:<resource attribute key>`.","schema":{"pattern":"^(service|signal|project|meter|tag:\\S{1,132})$","type":"string"}},{"name":"granularity","in":"query","required":false,"description":"`day` (default, at most 400 days) or `hour` (at most 31 days).","schema":{"enum":["day","hour"],"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Top groups to return (default 20, max 100); the rest are under `__other__`.","schema":{"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"description":"The cost report","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"currency":{"enum":["usd"],"type":"string"},"estimate":{"description":"Part of the report is an estimate (storage).","type":"boolean"},"from":{"format":"date-time","type":"string"},"granularity":{"enum":["day","hour"],"type":"string"},"group_by":{"type":"string"},"groups":{"description":"Groups by list cost, highest first.","items":{"additionalProperties":false,"properties":{"billed_cents":{"description":"Billed cost in whole cents, after the allowance.","minimum":0,"type":"integer"},"key":{"description":"Group value. Special keys: `__other__` (past `limit`), `__unattributed__` (usage without attribution), `__untagged__` (telemetry without the attribute).","type":"string"},"list_cents":{"description":"List cost in cents, before the monthly allowance (4 decimals).","minimum":0,"type":"number"},"meters":{"items":{"additionalProperties":false,"properties":{"billed_cents":{"description":"Billed cost in whole cents, after the allowance.","minimum":0,"type":"integer"},"estimate":{"description":"The rate is not final (storage).","type":"boolean"},"list_cents":{"description":"List cost in cents, before the monthly allowance (4 decimals).","minimum":0,"type":"number"},"meter":{"enum":["logs","replays","checks","aiCredits","storage"],"type":"string"},"quantity":{"description":"GB for logs (telemetry), GB-months for storage, else the catalog unit.","minimum":0,"type":"number"},"unit":{"type":"string"}},"required":["billed_cents","estimate","list_cents","meter","quantity","unit"],"type":"object"},"type":"array"}},"required":["billed_cents","key","list_cents","meters"],"type":"object"},"type":"array"},"notes":{"items":{"type":"string"},"type":"array"},"organization_id":{"format":"uuid","type":"string"},"plan_id":{"type":"string"},"rates":{"items":{"additionalProperties":false,"properties":{"billed":{"description":"The plan bills usage above the allowance.","type":"boolean"},"block_size":{"minimum":0,"type":"number"},"estimate":{"type":"boolean"},"included":{"description":"Monthly allowance in units.","minimum":0,"type":"number"},"meter":{"enum":["logs","replays","checks","aiCredits","storage"],"type":"string"},"price_cents":{"description":"List price of one block, in cents.","minimum":0,"type":"number"},"rate_plan_id":{"description":"The plan the rate comes from.","type":"string"},"rate_source":{"description":"`reference_plan`: the plan has no paid overage (Free), so list cost uses the cheapest plan that has one.","enum":["plan","reference_plan"],"type":"string"},"unit":{"type":"string"}},"required":["billed","block_size","estimate","included","meter","price_cents","rate_plan_id","rate_source","unit"],"type":"object"},"type":"array"},"series":{"description":"One entry per bucket from `from` to `to`.","items":{"additionalProperties":false,"properties":{"billed_cents":{"description":"Billed cost in whole cents, after the allowance.","minimum":0,"type":"integer"},"bucket":{"format":"date-time","type":"string"},"groups":{"items":{"additionalProperties":false,"properties":{"billed_cents":{"description":"Billed cost in whole cents, after the allowance.","minimum":0,"type":"integer"},"key":{"description":"Group value. Special keys: `__other__` (past `limit`), `__unattributed__` (usage without attribution), `__untagged__` (telemetry without the attribute).","type":"string"},"list_cents":{"description":"List cost in cents, before the monthly allowance (4 decimals).","minimum":0,"type":"number"}},"required":["billed_cents","key","list_cents"],"type":"object"},"type":"array"},"list_cents":{"description":"List cost in cents, before the monthly allowance (4 decimals).","minimum":0,"type":"number"}},"required":["billed_cents","bucket","groups","list_cents"],"type":"object"},"type":"array"},"to":{"format":"date-time","type":"string"},"totals":{"additionalProperties":false,"properties":{"billed_cents":{"description":"Billed cost in whole cents, after the allowance.","minimum":0,"type":"integer"},"list_cents":{"description":"List cost in cents, before the monthly allowance (4 decimals).","minimum":0,"type":"number"},"meters":{"items":{"additionalProperties":false,"properties":{"billed_cents":{"description":"Billed cost in whole cents, after the allowance.","minimum":0,"type":"integer"},"estimate":{"description":"The rate is not final (storage).","type":"boolean"},"list_cents":{"description":"List cost in cents, before the monthly allowance (4 decimals).","minimum":0,"type":"number"},"meter":{"enum":["logs","replays","checks","aiCredits","storage"],"type":"string"},"quantity":{"description":"GB for logs (telemetry), GB-months for storage, else the catalog unit.","minimum":0,"type":"number"},"unit":{"type":"string"}},"required":["billed_cents","estimate","list_cents","meter","quantity","unit"],"type":"object"},"type":"array"}},"required":["billed_cents","list_cents","meters"],"type":"object"}},"required":["currency","estimate","from","granularity","group_by","groups","notes","organization_id","plan_id","rates","series","to","totals"],"type":"object"}}}},"400":{"description":"Invalid organization ID, range, or parameter","content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"},"meter":{"type":"string"}},"required":["error"],"type":"object"}}}},"403":{"description":"The credential does not belong to the organization","content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"},"meter":{"type":"string"}},"required":["error"],"type":"object"}}}},"404":{"description":"Organization not found","content":{"application/json":{"schema":{"properties":{"error":{"type":"string"},"message":{"type":"string"},"meter":{"type":"string"}},"required":["error"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/integrations/providers":{"get":{"operationId":"integrations.listProviders","summary":"List provider-agnostic integration setup metadata for CLI, API, and MCP flows","description":"List provider-agnostic integration setup metadata for CLI, API, and MCP flows","tags":["integrations"],"security":[],"parameters":[],"responses":{"200":{"description":"OK"},"default":{"description":"Validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/provider-connections":{"get":{"operationId":"integrations.listConnections","summary":"List one-click provider connections for a project","description":"List one-click provider connections for a project","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/provider-connections/readiness":{"get":{"operationId":"integrations.providerReadiness","summary":"List side-effect-free runtime readiness for every one-click provider","description":"List side-effect-free runtime readiness for every one-click provider","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/provider-connections/{provider}":{"get":{"operationId":"integrations.getConnection","summary":"Get a one-click provider connection for a project","description":"Get a one-click provider connection for a project","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"provider","in":"path","required":true,"description":"One-click provider ID","schema":{"enum":["aws","cloudflare","gcp","notion","planetscale","railway","render","sentry","stripe","vercel"],"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"delete":{"operationId":"integrations.disconnectConnection","summary":"Remove a provider connection and its Squasher-owned remote resources","description":"Remove a provider connection and its Squasher-owned remote resources","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"provider","in":"path","required":true,"description":"One-click provider ID","schema":{"enum":["aws","cloudflare","gcp","notion","planetscale","railway","render","sentry","stripe","vercel"],"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/provider-connections/{provider}/connect-plan":{"post":{"operationId":"integrations.connectPlan","summary":"Create a short-lived authorization or infrastructure setup plan","description":"Create a short-lived authorization or infrastructure setup plan","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"provider","in":"path","required":true,"description":"One-click provider ID","schema":{"enum":["aws","cloudflare","gcp","notion","planetscale","railway","render","sentry","stripe","vercel"],"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"return_url":{"format":"uri","type":"string"},"settings":{"additionalProperties":true,"type":"object"}},"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/provider-connections/{provider}/reconcile":{"post":{"operationId":"integrations.reconcileConnection","summary":"Check and repair resources owned by a provider connection","description":"Check and repair resources owned by a provider connection","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"provider","in":"path","required":true,"description":"One-click provider ID","schema":{"enum":["aws","cloudflare","gcp","notion","planetscale","railway","render","sentry","stripe","vercel"],"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/provider-resources":{"get":{"operationId":"integrations.listProviderResources","summary":"List provider resources (zones, Workers, databases, branches, services) with key metrics and freshness","description":"List provider resources (zones, Workers, databases, branches, services) with key metrics and freshness","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"provider","in":"query","required":false,"description":"Only list resources from this provider","schema":{"enum":["aws","cloudflare","gcp","notion","planetscale","railway","render","sentry","stripe","vercel"],"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/provider-health":{"get":{"operationId":"integrations.providerHealth","summary":"Show data freshness and the last error for each provider stream","description":"Show data freshness and the last error for each provider stream","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/provider-connections/planetscale":{"post":{"operationId":"integrations.connectPlanetScale","summary":"Connect PlanetScale with a read-only organization service token","description":"Connect PlanetScale with a read-only organization service token","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"organization":{"maxLength":128,"minLength":1,"type":"string"},"service_token":{"maxLength":512,"minLength":1,"type":"string"},"service_token_id":{"maxLength":128,"minLength":1,"type":"string"}},"required":["organization","service_token_id","service_token"],"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/provider-connections/planetscale/webhook":{"put":{"operationId":"integrations.setPlanetScaleWebhookSecret","summary":"Save the PlanetScale webhook signing secret for deploy request events","description":"Save the PlanetScale webhook signing secret for deploy request events","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"secret":{"maxLength":512,"minLength":8,"type":"string"}},"required":["secret"],"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/provider-connections/cloudflare/analytics":{"put":{"operationId":"integrations.setCloudflareAnalytics","summary":"Turn the Cloudflare analytics metrics pull on or off","description":"Turn the Cloudflare analytics metrics pull on or off","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/provider-connections/cloudflare/accounts":{"get":{"operationId":"integrations.listCloudflareAccounts","summary":"List Cloudflare accounts available to the connected project","description":"List Cloudflare accounts available to the connected project","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/provider-connections/cloudflare/workers":{"get":{"operationId":"integrations.listCloudflareWorkers","summary":"List Cloudflare Workers in an account available to the connected project","description":"List Cloudflare Workers in an account available to the connected project","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"account_id","in":"query","required":true,"description":"Cloudflare account ID returned by listCloudflareAccounts","schema":{"minLength":1,"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/provider-connections/cloudflare/provision":{"post":{"operationId":"integrations.provisionCloudflare","summary":"Provision selected Cloudflare Workers for a project","description":"Provision selected Cloudflare Workers for a project","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"account_id":{"minLength":1,"type":"string"},"worker_ids":{"items":{"minLength":1,"type":"string"},"maxItems":100,"minItems":1,"type":"array"}},"required":["account_id","worker_ids"],"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/provider-connections/stripe":{"post":{"operationId":"integrations.connectStripe","summary":"Connect Stripe for revenue with a restricted read-only key (rk_live_ or rk_test_). Returns the webhook URL and the event types to select. Needs product analytics on the plan.","description":"Connect Stripe for revenue with a restricted read-only key (rk_live_ or rk_test_). Returns the webhook URL and the event types to select. Needs product analytics on the plan.","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"restricted_key":{"maxLength":255,"minLength":10,"type":"string"}},"required":["restricted_key"],"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/provider-connections/stripe/webhook":{"put":{"operationId":"integrations.setStripeWebhookSecret","summary":"Save the signing secret (whsec_...) of the Stripe webhook endpoint for revenue events","description":"Save the signing secret (whsec_...) of the Stripe webhook endpoint for revenue events","tags":["integrations"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"secret":{"maxLength":512,"minLength":16,"pattern":"^whsec_","type":"string"}},"required":["secret"],"type":"object"}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/infrastructure/collectors":{"get":{"operationId":"infrastructure.collectors.list","summary":"List Squasher Collectors seen from their OpenTelemetry self-metrics","description":"List Squasher Collectors seen from their OpenTelemetry self-metrics","tags":["infrastructure"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum collectors to return, from 1 through 100","schema":{"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/infrastructure/overview":{"get":{"operationId":"infrastructure.collectors.overview","summary":"Get active, degraded, and offline Squasher Collector counts","description":"Get active, degraded, and offline Squasher Collector counts","tags":["infrastructure"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/log-connectors/catalog":{"get":{"operationId":"logConnectors.catalog","summary":"List supported log connector profiles","description":"List supported log connector profiles","tags":["logConnectors"],"parameters":[],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/log-connectors":{"get":{"operationId":"logConnectors.list","summary":"List log connectors configured for a project","description":"List log connectors configured for a project","tags":["logConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"logConnectors.create","summary":"Create a log connector and issue a dedicated ingest key","description":"Create a log connector and issue a dedicated ingest key","tags":["logConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/log-connectors/onboard":{"post":{"operationId":"logConnectors.onboard","summary":"Create a log connector with self-serve onboarding instructions","description":"Create a log connector with self-serve onboarding instructions","tags":["logConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/log-connectors/{connection_id}":{"get":{"operationId":"logConnectors.get","summary":"Get a single log connector connection","description":"Get a single log connector connection","tags":["logConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connection_id","in":"path","required":true,"description":"Path parameter connection_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"logConnectors.update","summary":"Update a log connector connection","description":"Update a log connector connection","tags":["logConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connection_id","in":"path","required":true,"description":"Path parameter connection_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"logConnectors.delete","summary":"Delete a log connector and revoke its managed key","description":"Delete a log connector and revoke its managed key","tags":["logConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connection_id","in":"path","required":true,"description":"Path parameter connection_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/log-connectors/{connection_id}/verify":{"post":{"operationId":"logConnectors.verify","summary":"Mark a log connector as verified","description":"Mark a log connector as verified","tags":["logConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connection_id","in":"path","required":true,"description":"Path parameter connection_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/log-connectors/{connection_id}/rotate-key":{"post":{"operationId":"logConnectors.rotateKey","summary":"Rotate the managed ingest key for a connector","description":"Rotate the managed ingest key for a connector","tags":["logConnectors"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connection_id","in":"path","required":true,"description":"Path parameter connection_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/billing/plans":{"get":{"operationId":"billing.listPlans","summary":"List available billing plans","description":"List available billing plans","tags":["billing"],"security":[],"parameters":[],"responses":{"200":{"description":"Current plan allowances, capabilities, and meter billing status","content":{"application/json":{"schema":{"items":{"additionalProperties":false,"properties":{"capabilities":{"additionalProperties":false,"properties":{"advanced_check_types":{"type":"boolean"},"ai_incident_assistant":{"type":"boolean"},"ai_triage":{"type":"boolean"},"anomaly_detection":{"type":"boolean"},"auto_fix":{"type":"boolean"},"custom_css":{"type":"boolean"},"custom_domains":{"type":"boolean"},"incident_management":{"type":"boolean"},"investigations":{"type":"boolean"},"maintenance_windows":{"type":"boolean"},"priority_support":{"type":"boolean"},"private_status_pages":{"type":"boolean"},"product_analytics":{"type":"boolean"},"provider_metrics":{"type":"boolean"},"release_tracking":{"type":"boolean"},"service_map":{"type":"boolean"},"sso":{"type":"boolean"},"status_pages":{"type":"boolean"},"uptime_monitoring":{"type":"boolean"}},"required":["advanced_check_types","ai_incident_assistant","ai_triage","anomaly_detection","auto_fix","custom_css","custom_domains","incident_management","investigations","maintenance_windows","priority_support","private_status_pages","product_analytics","provider_metrics","release_tracking","service_map","sso","status_pages","uptime_monitoring"],"type":"object"},"ai_credit_limit":{"minimum":0,"type":"integer","description":"AI credits included per month. Each Squasher Agent action uses a fixed number of credits, once per action."},"ai_investigation_limit":{"minimum":0,"type":"integer","description":"Investigations the included AI credits pay for each month. Investigations use AI credits; all agent runs of one investigation count once."},"check_limit":{"minimum":0,"type":"integer"},"coming_soon":{"additionalProperties":false,"description":"Capabilities, meters, and retention entries that the plan lists before their product area is available. They are not counted or billed.","properties":{"capabilities":{"items":{"enum":["advanced_check_types","ai_incident_assistant","ai_triage","anomaly_detection","auto_fix","custom_css","custom_domains","incident_management","investigations","maintenance_windows","priority_support","private_status_pages","product_analytics","provider_metrics","release_tracking","service_map","sso","status_pages","uptime_monitoring"],"type":"string"},"type":"array"},"meters":{"items":{"enum":["ai_credits","checks","logs","product_events","replays","sms_alerts","voice_alerts"],"type":"string"},"type":"array"},"retention":{"items":{"enum":["ai_observations","errors","findings","investigations","logs","metrics","product_events","replays","traces"],"type":"string"},"type":"array"}},"required":["capabilities","meters","retention"],"type":"object"},"features":{"items":{"type":"string"},"type":"array"},"id":{"enum":["free","pro","team","scale"],"type":"string"},"log_limit":{"minimum":0,"type":"integer","description":"Legacy alias for telemetry_gb_limit."},"monitor_limit":{"minimum":0,"type":"integer"},"name":{"type":"string"},"overage":{"additionalProperties":false,"properties":{"ai_credits":{"additionalProperties":false,"properties":{"allowed":{"type":"boolean"},"billing_status":{"description":"not_billed means no overage charge is active for this meter.","enum":["cataloged","not_billed"],"type":"string"},"block_size":{"minimum":0,"type":"integer"},"price_cents":{"minimum":0,"type":"integer"},"unit":{"enum":["call","check","credit","event","gb","session","sms"],"type":"string"}},"required":["allowed","billing_status","block_size","price_cents","unit"],"type":"object"},"checks":{"additionalProperties":false,"properties":{"allowed":{"type":"boolean"},"billing_status":{"description":"not_billed means no overage charge is active for this meter.","enum":["cataloged","not_billed"],"type":"string"},"block_size":{"minimum":0,"type":"integer"},"price_cents":{"minimum":0,"type":"integer"},"unit":{"enum":["call","check","credit","event","gb","session","sms"],"type":"string"}},"required":["allowed","billing_status","block_size","price_cents","unit"],"type":"object"},"logs":{"additionalProperties":false,"properties":{"allowed":{"type":"boolean"},"billing_status":{"description":"not_billed means no overage charge is active for this meter.","enum":["cataloged","not_billed"],"type":"string"},"block_size":{"minimum":0,"type":"integer"},"price_cents":{"minimum":0,"type":"integer"},"unit":{"enum":["call","check","credit","event","gb","session","sms"],"type":"string"}},"required":["allowed","billing_status","block_size","price_cents","unit"],"type":"object"},"product_events":{"additionalProperties":false,"properties":{"allowed":{"type":"boolean"},"billing_status":{"description":"not_billed means no overage charge is active for this meter.","enum":["cataloged","not_billed"],"type":"string"},"block_size":{"minimum":0,"type":"integer"},"price_cents":{"minimum":0,"type":"integer"},"unit":{"enum":["call","check","credit","event","gb","session","sms"],"type":"string"}},"required":["allowed","billing_status","block_size","price_cents","unit"],"type":"object"},"replays":{"additionalProperties":false,"properties":{"allowed":{"type":"boolean"},"billing_status":{"description":"not_billed means no overage charge is active for this meter.","enum":["cataloged","not_billed"],"type":"string"},"block_size":{"minimum":0,"type":"integer"},"price_cents":{"minimum":0,"type":"integer"},"unit":{"enum":["call","check","credit","event","gb","session","sms"],"type":"string"}},"required":["allowed","billing_status","block_size","price_cents","unit"],"type":"object"},"sms_alerts":{"additionalProperties":false,"properties":{"allowed":{"type":"boolean"},"billing_status":{"description":"not_billed means no overage charge is active for this meter.","enum":["cataloged","not_billed"],"type":"string"},"block_size":{"minimum":0,"type":"integer"},"price_cents":{"minimum":0,"type":"integer"},"unit":{"enum":["call","check","credit","event","gb","session","sms"],"type":"string"}},"required":["allowed","billing_status","block_size","price_cents","unit"],"type":"object"},"voice_alerts":{"additionalProperties":false,"properties":{"allowed":{"type":"boolean"},"billing_status":{"description":"not_billed means no overage charge is active for this meter.","enum":["cataloged","not_billed"],"type":"string"},"block_size":{"minimum":0,"type":"integer"},"price_cents":{"minimum":0,"type":"integer"},"unit":{"enum":["call","check","credit","event","gb","session","sms"],"type":"string"}},"required":["allowed","billing_status","block_size","price_cents","unit"],"type":"object"}},"required":["ai_credits","checks","logs","product_events","replays","sms_alerts","voice_alerts"],"type":"object"},"price_monthly":{"minimum":0,"type":"number"},"product_event_limit":{"minimum":0,"type":"integer","description":"Product events included per month, after consent checks and duplicate removal."},"project_limit":{"type":["integer","null"]},"replay_limit":{"minimum":0,"type":"integer"},"retention_days_by_feature":{"additionalProperties":false,"properties":{"ai_observations":{"minimum":0,"type":"integer"},"errors":{"minimum":0,"type":"integer"},"findings":{"minimum":0,"type":"integer"},"investigations":{"minimum":0,"type":"integer"},"logs":{"minimum":0,"type":"integer"},"metrics":{"minimum":0,"type":"integer"},"product_events":{"minimum":0,"type":"integer"},"replays":{"minimum":0,"type":"integer"},"traces":{"minimum":0,"type":"integer"}},"required":["ai_observations","errors","findings","investigations","logs","metrics","product_events","replays","traces"],"type":"object"},"status_component_limit":{"minimum":0,"type":"integer"},"status_page_limit":{"minimum":0,"type":"integer"},"status_subscriber_limit":{"minimum":0,"type":"integer","description":"Confirmed status page subscribers allowed across all pages. A plan limit."},"telemetry_gb_limit":{"minimum":0,"type":"integer","description":"Telemetry GB included per month: uncompressed bytes of errors, logs, traces, metrics, web vitals, and AI observations as received."}},"required":["ai_credit_limit","ai_investigation_limit","capabilities","check_limit","coming_soon","features","id","log_limit","monitor_limit","name","overage","price_monthly","product_event_limit","project_limit","replay_limit","retention_days_by_feature","status_component_limit","status_page_limit","status_subscriber_limit","telemetry_gb_limit"],"type":"object"},"type":"array"}}}},"default":{"description":"Validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":false,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/ask":{"post":{"operationId":"chat.ask","summary":"Create or continue a project chat thread with a user question","description":"Create or continue a project chat thread with a user question","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string"},"source":{"type":"string","enum":["api","cli","mcp","slack","system","web"]},"thread_id":{"type":["string","null"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/ask/stream":{"post":{"operationId":"chat.askStream","summary":"Create or continue a project chat thread and stream the assistant answer","description":"Create or continue a project chat thread and stream the assistant answer","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"Accept","in":"header","required":false,"description":"Use application/x-ndjson to receive typed status, text-delta, platform-result, done, and error events. Use application/x-ndjson; steps=1 to also receive step-start and tool events. Defaults to text/plain.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string"},"source":{"type":"string","enum":["api","cli","mcp","slack","system","web"]},"thread_id":{"type":["string","null"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/threads":{"get":{"operationId":"chat.threads.list","summary":"List project chat threads visible to the team","description":"List project chat threads visible to the team","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"incident_id","in":"query","required":false,"description":"Only return the durable thread bound to this incident; accepts its display ID or canonical UUID","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"type":"integer"}},{"name":"status","in":"query","required":false,"description":"Query parameter status","schema":{"type":"string","enum":["active","all","archived"]}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"chat.threads.create","summary":"Create a project chat thread","description":"Create a project chat thread","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"external_thread_id":{"type":["string","null"]},"source":{"type":"string","enum":["api","cli","mcp","slack","system","web"]},"title":{"type":["string","null"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/threads/search":{"get":{"operationId":"chat.threads.search","summary":"Search project chat threads by title","description":"Search project chat threads by title","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/threads/{thread_id}":{"get":{"operationId":"chat.threads.get","summary":"Get a project chat thread","description":"Get a project chat thread","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"thread_id","in":"path","required":true,"description":"Path parameter thread_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"delete":{"operationId":"chat.threads.delete","summary":"Delete a project chat thread and its messages","description":"Delete a project chat thread and its messages","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"thread_id","in":"path","required":true,"description":"Path parameter thread_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/threads/{thread_id}/archive":{"post":{"operationId":"chat.threads.archive","summary":"Archive a project chat thread","description":"Archive a project chat thread","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"thread_id","in":"path","required":true,"description":"Path parameter thread_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/threads/{thread_id}/unarchive":{"post":{"operationId":"chat.threads.unarchive","summary":"Unarchive a project chat thread","description":"Unarchive a project chat thread","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"thread_id","in":"path","required":true,"description":"Path parameter thread_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/threads/{thread_id}/messages":{"get":{"operationId":"chat.messages.list","summary":"List messages in a project chat thread","description":"List messages in a project chat thread","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"thread_id","in":"path","required":true,"description":"Path parameter thread_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"chat.messages.send","summary":"Append a message to a project chat thread","description":"Append a message to a project chat thread","tags":["chat"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"thread_id","in":"path","required":true,"description":"Path parameter thread_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"author_image":{"type":["string","null"]},"author_name":{"type":["string","null"]},"external_message_id":{"type":["string","null"]},"message":{"type":"string"},"role":{"type":"string","enum":["assistant","system","user"]},"source":{"type":"string","enum":["api","cli","mcp","slack","system","web"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/query":{"post":{"operationId":"query.run","summary":"Run a safe, scoped SELECT over the public observability query model.","description":"Run a safe, scoped SELECT over the public observability query model.","tags":["query"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sql":{"type":"string","description":"SELECT statement over the public observability query model."},"long_range":{"type":"boolean","description":"Allow a 30d-90d time window when the project policy permits it."}},"required":["sql"],"additionalProperties":false}}}},"responses":{"200":{"description":"Query results","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","additionalProperties":true}},"columns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"}},"required":["name","type"],"additionalProperties":false}},"scanned_rows":{"type":"integer","description":"Rows the query read, not the rows it returned."},"scanned_bytes":{"type":"integer","description":"Bytes the query read to produce the result."},"duration_ms":{"type":"integer"}},"required":["rows","columns","scanned_rows","scanned_bytes","duration_ms"],"additionalProperties":false}}}},"400":{"description":"Invalid, unsafe, or unsupported query","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["NOT_SELECT","PARSE_FAILED","FORBIDDEN_TABLE","MISSING_TIMESTAMP_FILTER","RANGE_TOO_LARGE","LIMIT_TOO_HIGH","FORBIDDEN_SELECT_STAR","UNKNOWN_COLUMN","CROSS_PROJECT_REFERENCE","UNSUPPORTED_STATEMENT","QUERY_REJECTED","QUERY_BUDGET_EXCEEDED","QUERY_RESULT_TOO_LARGE","QUERY_TEMPORARILY_UNAVAILABLE","UPSTREAM_QUERY_FAILED","invalid_request"]},"hint":{"type":"string"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false}}}},"503":{"description":"Safe-query executor is unavailable or temporarily saturated","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["NOT_SELECT","PARSE_FAILED","FORBIDDEN_TABLE","MISSING_TIMESTAMP_FILTER","RANGE_TOO_LARGE","LIMIT_TOO_HIGH","FORBIDDEN_SELECT_STAR","UNKNOWN_COLUMN","CROSS_PROJECT_REFERENCE","UNSUPPORTED_STATEMENT","QUERY_REJECTED","QUERY_BUDGET_EXCEEDED","QUERY_RESULT_TOO_LARGE","QUERY_TEMPORARILY_UNAVAILABLE","UPSTREAM_QUERY_FAILED","invalid_request"]},"hint":{"type":"string"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/query/explain":{"post":{"operationId":"query.explain","summary":"EXPLAIN ESTIMATE for a safe query — returns estimated rows, bytes, budget verdict.","description":"EXPLAIN ESTIMATE for a safe query — returns estimated rows, bytes, budget verdict.","tags":["query"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sql":{"type":"string","description":"SELECT statement over the public observability query model."},"long_range":{"type":"boolean","description":"Allow a 30d-90d time window when the project policy permits it."}},"required":["sql"],"additionalProperties":false}}}},"responses":{"200":{"description":"Query cost estimate","content":{"application/json":{"schema":{"type":"object","properties":{"estimated_rows":{"type":"integer"},"estimated_bytes":{"type":"integer"},"suggested_indexes":{"type":"array","items":{"type":"string"}},"exceeds_budget":{"type":"boolean"}},"required":["estimated_rows","estimated_bytes","suggested_indexes","exceeds_budget"],"additionalProperties":false}}}},"400":{"description":"Invalid, unsafe, or unsupported query","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["NOT_SELECT","PARSE_FAILED","FORBIDDEN_TABLE","MISSING_TIMESTAMP_FILTER","RANGE_TOO_LARGE","LIMIT_TOO_HIGH","FORBIDDEN_SELECT_STAR","UNKNOWN_COLUMN","CROSS_PROJECT_REFERENCE","UNSUPPORTED_STATEMENT","QUERY_REJECTED","QUERY_BUDGET_EXCEEDED","QUERY_RESULT_TOO_LARGE","QUERY_TEMPORARILY_UNAVAILABLE","UPSTREAM_QUERY_FAILED","invalid_request"]},"hint":{"type":"string"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false}}}},"503":{"description":"Safe-query executor is unavailable","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["NOT_SELECT","PARSE_FAILED","FORBIDDEN_TABLE","MISSING_TIMESTAMP_FILTER","RANGE_TOO_LARGE","LIMIT_TOO_HIGH","FORBIDDEN_SELECT_STAR","UNKNOWN_COLUMN","CROSS_PROJECT_REFERENCE","UNSUPPORTED_STATEMENT","QUERY_REJECTED","QUERY_BUDGET_EXCEEDED","QUERY_RESULT_TOO_LARGE","QUERY_TEMPORARILY_UNAVAILABLE","UPSTREAM_QUERY_FAILED","invalid_request"]},"hint":{"type":"string"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/replays":{"get":{"operationId":"replays.list","summary":"List recorded replay sessions for a project","description":"List recorded replay sessions for a project","tags":["replays"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/replays/search":{"get":{"operationId":"replays.search","summary":"Search recorded replay session rollups with compact field masks","description":"Search recorded replay session rollups with compact field masks","tags":["replays"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":true,"description":"Query parameter from","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":true,"description":"Query parameter to","schema":{"type":"string","format":"date-time"}},{"name":"ai_freeform_tag","in":"query","required":false,"description":"Query parameter ai_freeform_tag","schema":{"type":"string"}},{"name":"ai_highlighted","in":"query","required":false,"description":"Query parameter ai_highlighted","schema":{"type":"boolean"}},{"name":"ai_tag","in":"query","required":false,"description":"Query parameter ai_tag","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"fields","in":"query","required":false,"description":"Comma-separated replay summary fields: session_id, started_at, ended_at, retention_expires_at, retention_state, segment_reads_allowed, deleted_at, deleted_reason, duration_ms, first_url, page_urls, message_count, interaction_count, click_count, keypress_count, mouse_activity_count, active_ms, console_log_count, console_warn_count, console_error_count, network_request_count, network_failed_count, ai_tags, ai_freeform_tags, ai_highlighted, ai_enrichment_status, ai_enriched_at, ai_enrichment_error, source, library, library_version, sdk_package, sdk_version, event_count, error_count, distinct_id, user_id, visitor_id, environment, release, storage_bytes, storage_key_prefix, created_at, segment_count","schema":{"type":"string"}},{"name":"library","in":"query","required":false,"description":"Query parameter library","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Default 25, clamped to 100","schema":{"type":"integer"}},{"name":"min_console_errors","in":"query","required":false,"description":"Query parameter min_console_errors","schema":{"type":"integer"}},{"name":"min_console_logs","in":"query","required":false,"description":"Query parameter min_console_logs","schema":{"type":"integer"}},{"name":"min_console_warnings","in":"query","required":false,"description":"Query parameter min_console_warnings","schema":{"type":"integer"}},{"name":"min_interactions","in":"query","required":false,"description":"Query parameter min_interactions","schema":{"type":"integer"}},{"name":"min_network_failed","in":"query","required":false,"description":"Query parameter min_network_failed","schema":{"type":"integer"}},{"name":"order","in":"query","required":false,"description":"Query parameter order","schema":{"type":"string","enum":["active_ms_desc","console_error_count_desc","created_at_asc","created_at_desc","interaction_count_desc","network_failed_count_desc","started_at_asc","started_at_desc"]}},{"name":"release","in":"query","required":false,"description":"Query parameter release","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Query parameter source","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"Query parameter url","schema":{"type":"string"}}],"responses":{"200":{"description":"Compact replay search results","content":{"application/json":{"schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["session_id","started_at","ended_at","retention_expires_at","retention_state","segment_reads_allowed","deleted_at","deleted_reason","duration_ms","first_url","page_urls","message_count","interaction_count","click_count","keypress_count","mouse_activity_count","active_ms","console_log_count","console_warn_count","console_error_count","network_request_count","network_failed_count","ai_tags","ai_freeform_tags","ai_highlighted","ai_enrichment_status","ai_enriched_at","ai_enrichment_error","source","library","library_version","sdk_package","sdk_version","event_count","error_count","distinct_id","user_id","visitor_id","environment","release","storage_bytes","storage_key_prefix","created_at","segment_count"]}},"limit":{"type":"integer"},"order":{"type":"string","enum":["active_ms_desc","console_error_count_desc","created_at_asc","created_at_desc","interaction_count_desc","network_failed_count_desc","started_at_asc","started_at_desc"]},"replays":{"type":"array","items":{"type":"object","properties":{"active_ms":{"type":"integer"},"ai_enriched_at":{"type":["string","null"],"format":"date-time"},"ai_enrichment_error":{"type":["string","null"]},"ai_freeform_tags":{"type":"array","items":{"type":"string"}},"ai_highlighted":{"type":"boolean"},"ai_enrichment_status":{"type":"string","enum":["failed","not_started","succeeded"]},"ai_tags":{"type":"array","items":{"type":"string"}},"click_count":{"type":"integer"},"console_error_count":{"type":"integer"},"console_log_count":{"type":"integer"},"console_warn_count":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"deleted_at":{"type":["string","null"],"format":"date-time"},"deleted_reason":{"type":["string","null"]},"distinct_id":{"type":["string","null"]},"duration_ms":{"type":"integer"},"ended_at":{"type":["string","null"],"format":"date-time"},"environment":{"type":["string","null"]},"error_count":{"type":"integer"},"event_count":{"type":"integer"},"first_url":{"type":"string"},"interaction_count":{"type":"integer"},"keypress_count":{"type":"integer"},"library":{"type":["string","null"]},"library_version":{"type":["string","null"]},"message_count":{"type":"integer"},"mouse_activity_count":{"type":"integer"},"network_failed_count":{"type":"integer"},"network_request_count":{"type":"integer"},"page_urls":{"type":"array","items":{"type":"string"}},"release":{"type":["string","null"]},"retention_expires_at":{"type":["string","null"],"format":"date-time"},"retention_state":{"type":"string","enum":["active","deleted","expired","unknown"]},"sdk_package":{"type":["string","null"]},"sdk_version":{"type":["string","null"]},"segment_count":{"type":"integer"},"segment_reads_allowed":{"type":"boolean"},"session_id":{"type":"string"},"source":{"type":["string","null"]},"started_at":{"type":"string","format":"date-time"},"storage_bytes":{"type":"integer"},"storage_key_prefix":{"type":"string"},"user_id":{"type":["string","null"]},"visitor_id":{"type":["string","null"]}},"additionalProperties":false}}},"required":["fields","limit","order","replays"],"additionalProperties":false}}}},"422":{"description":"Invalid replay search parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/replays/{session_id}":{"get":{"operationId":"replays.get","summary":"Get replay session metadata and indexed segments","description":"Get replay session metadata and indexed segments","tags":["replays"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"session_id","in":"path","required":true,"description":"Replay session UUID returned by replays.search.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/replays/{session_id}/story":{"get":{"operationId":"replays.story","summary":"Start here to understand a session: summary, findings, and one step per page, click, failed request, and error. Use format=text for a transcript.","description":"Start here to understand a session: summary, findings, and one step per page, click, failed request, and error. Use format=text for a transcript.","tags":["replays"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"session_id","in":"path","required":true,"description":"Replay session UUID returned by replays.search.","schema":{"type":"string","format":"uuid"}},{"name":"format","in":"query","required":false,"description":"json (default) returns the replay summary, story, coverage, and segments. text returns a plain-text transcript.","schema":{"type":"string","enum":["json","text"]}}],"responses":{"200":{"description":"Replay story. With format=text the body is a text/plain transcript instead of JSON.","content":{"application/json":{"schema":{"type":"object","properties":{"coverage":{"type":"object","properties":{"partial":{"type":"boolean"},"segments_loaded":{"type":"integer"},"segments_missing":{"type":"integer"}},"required":["partial","segments_loaded","segments_missing"],"additionalProperties":false},"replay":{"type":"object","properties":{"active_ms":{"type":"integer"},"ai_enriched_at":{"type":["string","null"],"format":"date-time"},"ai_enrichment_error":{"type":["string","null"]},"ai_freeform_tags":{"type":"array","items":{"type":"string"}},"ai_highlighted":{"type":"boolean"},"ai_enrichment_status":{"type":"string","enum":["failed","not_started","succeeded"]},"ai_tags":{"type":"array","items":{"type":"string"}},"click_count":{"type":"integer"},"console_error_count":{"type":"integer"},"console_log_count":{"type":"integer"},"console_warn_count":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"deleted_at":{"type":["string","null"],"format":"date-time"},"deleted_reason":{"type":["string","null"]},"distinct_id":{"type":["string","null"]},"duration_ms":{"type":"integer"},"ended_at":{"type":["string","null"],"format":"date-time"},"environment":{"type":["string","null"]},"error_count":{"type":"integer"},"event_count":{"type":"integer"},"first_url":{"type":"string"},"interaction_count":{"type":"integer"},"keypress_count":{"type":"integer"},"library":{"type":["string","null"]},"library_version":{"type":["string","null"]},"message_count":{"type":"integer"},"mouse_activity_count":{"type":"integer"},"network_failed_count":{"type":"integer"},"network_request_count":{"type":"integer"},"page_urls":{"type":"array","items":{"type":"string"}},"release":{"type":["string","null"]},"retention_expires_at":{"type":["string","null"],"format":"date-time"},"retention_state":{"type":"string","enum":["active","deleted","expired","unknown"]},"sdk_package":{"type":["string","null"]},"sdk_version":{"type":["string","null"]},"segment_count":{"type":"integer"},"segment_reads_allowed":{"type":"boolean"},"session_id":{"type":"string"},"source":{"type":["string","null"]},"started_at":{"type":"string","format":"date-time"},"storage_bytes":{"type":"integer"},"storage_key_prefix":{"type":"string"},"user_id":{"type":["string","null"]},"visitor_id":{"type":["string","null"]}},"required":["session_id","started_at","ended_at","retention_expires_at","retention_state","segment_reads_allowed","deleted_at","deleted_reason","duration_ms","first_url","page_urls","message_count","interaction_count","click_count","keypress_count","mouse_activity_count","active_ms","console_log_count","console_warn_count","console_error_count","network_request_count","network_failed_count","ai_tags","ai_freeform_tags","ai_highlighted","ai_enrichment_status","ai_enriched_at","ai_enrichment_error","source","library","library_version","sdk_package","sdk_version","event_count","error_count","storage_bytes","storage_key_prefix","created_at","segment_count"],"additionalProperties":false},"segments":{"type":"array","items":{"type":"object","properties":{"ended_at":{"type":"string","format":"date-time"},"event_count":{"type":"integer"},"segment_index":{"type":"integer"},"size_bytes":{"type":"integer"},"started_at":{"type":"string","format":"date-time"}},"required":["ended_at","event_count","segment_index","size_bytes","started_at"],"additionalProperties":false}},"story":{"type":"object","properties":{"active_ms":{"type":"integer"},"activity":{"type":"array","items":{"type":"array","items":{"type":"integer"},"minItems":2,"maxItems":2}},"duration_ms":{"type":"integer"},"findings":{"type":"array","items":{"type":"object","properties":{"count":{"type":"integer"},"detail":{"type":"string"},"fingerprint":{"type":"string"},"id":{"type":"string"},"kind":{"type":"string","enum":["error","backend_error","request_failed","rage_click","dead_click","request_slow"]},"offsets_ms":{"type":"array","items":{"type":"integer"},"maxItems":20},"title":{"type":"string"},"tone":{"type":"string","enum":["problem","friction","neutral"]},"trace_ids":{"type":"array","items":{"type":"string"}}},"required":["count","detail","id","kind","offsets_ms","title","tone"],"additionalProperties":false}},"idle":{"type":"array","items":{"type":"array","items":{"type":"integer"},"minItems":2,"maxItems":2}},"logs":{"type":"array","items":{"type":"object","properties":{"browser":{"type":"boolean"},"event_id":{"type":"string"},"fingerprint":{"type":["string","null"]},"level":{"type":"string"},"message":{"type":"string"},"offset_ms":{"type":"integer"},"service":{"type":["string","null"]},"stack":{"type":["string","null"]},"trace_id":{"type":["string","null"]}},"required":["browser","event_id","fingerprint","level","message","offset_ms","service","stack","trace_id"],"additionalProperties":false}},"pages":{"type":"array","items":{"type":"object","properties":{"end_ms":{"type":"integer"},"offset_ms":{"type":"integer"},"path":{"type":"string"},"url":{"type":"string"}},"required":["end_ms","offset_ms","path","url"],"additionalProperties":false}},"requests":{"type":"array","items":{"type":"object","properties":{"duration_ms":{"type":["integer","null"]},"failed":{"type":"boolean"},"initiator":{"type":["string","null"]},"method":{"type":"string"},"offset_ms":{"type":"integer"},"page_url":{"type":["string","null"]},"status_code":{"type":["integer","null"]},"transfer_bytes":{"type":["integer","null"]},"url":{"type":"string"}},"required":["duration_ms","failed","initiator","method","offset_ms","page_url","status_code","transfer_bytes","url"],"additionalProperties":false}},"start_ms":{"type":"integer"},"steps":{"type":"array","items":{"type":"object","properties":{"count":{"type":"integer"},"detail":{"type":"string"},"end_ms":{"type":"integer"},"id":{"type":"string"},"kind":{"type":"string","enum":["page","click","rage_click","dead_click","input","request_failed","request_slow","error","backend_error","idle"]},"label":{"type":"string"},"log_index":{"type":"integer"},"offset_ms":{"type":"integer"},"page_url":{"type":"string"},"request_index":{"type":"integer"},"tone":{"type":"string","enum":["problem","friction","neutral"]}},"required":["count","id","kind","label","offset_ms","tone"],"additionalProperties":false}},"summary":{"type":"string"},"truncated":{"type":"boolean"},"version":{"type":"integer","enum":[1]},"viewport":{"anyOf":[{"type":"object","properties":{"height":{"type":"integer"},"width":{"type":"integer"}},"required":["height","width"],"additionalProperties":false},{"type":"null"}]}},"required":["active_ms","activity","duration_ms","findings","idle","logs","pages","requests","start_ms","steps","summary","truncated","version","viewport"],"additionalProperties":false}},"required":["coverage","replay","segments","story"],"additionalProperties":false}}}},"404":{"description":"Replay session not found or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid replay story parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/replays/{session_id}/inspect":{"get":{"operationId":"replays.inspect","summary":"Inspect a replay with a compact timeline of important moments","description":"Inspect a replay with a compact timeline of important moments","tags":["replays"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"session_id","in":"path","required":true,"description":"Replay session UUID returned by replays.search.","schema":{"type":"string","format":"uuid"}},{"name":"include","in":"query","required":false,"description":"Comma-separated timeline categories: activity, console, network, page, replay_error, segment","schema":{"type":"string"}},{"name":"exclude","in":"query","required":false,"description":"Comma-separated timeline categories to omit: activity, console, network, page, replay_error, segment","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Default 100, clamped to 200","schema":{"type":"integer"}},{"name":"slow_network_ms","in":"query","required":false,"description":"Query parameter slow_network_ms","schema":{"type":"integer"}}],"responses":{"200":{"description":"Compact replay timeline inspection","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"string","enum":["activity","console","network","page","replay_error","segment"]}},"counts":{"type":"object","properties":{"by_type":{"type":"object","additionalProperties":{"type":"integer"}},"total":{"type":"integer"},"truncated":{"type":"boolean"}},"required":["by_type","total","truncated"],"additionalProperties":false},"coverage":{"type":"object","properties":{"partial":{"type":"boolean"},"segments_loaded":{"type":"integer"},"segments_missing":{"type":"integer"}},"required":["partial","segments_loaded","segments_missing"],"additionalProperties":false},"limit":{"type":"integer"},"replay":{"type":"object","properties":{"active_ms":{"type":"integer"},"ai_enriched_at":{"type":["string","null"],"format":"date-time"},"ai_enrichment_error":{"type":["string","null"]},"ai_freeform_tags":{"type":"array","items":{"type":"string"}},"ai_highlighted":{"type":"boolean"},"ai_enrichment_status":{"type":"string","enum":["failed","not_started","succeeded"]},"ai_tags":{"type":"array","items":{"type":"string"}},"click_count":{"type":"integer"},"console_error_count":{"type":"integer"},"console_log_count":{"type":"integer"},"console_warn_count":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"deleted_at":{"type":["string","null"],"format":"date-time"},"deleted_reason":{"type":["string","null"]},"distinct_id":{"type":["string","null"]},"duration_ms":{"type":"integer"},"ended_at":{"type":["string","null"],"format":"date-time"},"environment":{"type":["string","null"]},"error_count":{"type":"integer"},"event_count":{"type":"integer"},"first_url":{"type":"string"},"interaction_count":{"type":"integer"},"keypress_count":{"type":"integer"},"library":{"type":["string","null"]},"library_version":{"type":["string","null"]},"message_count":{"type":"integer"},"mouse_activity_count":{"type":"integer"},"network_failed_count":{"type":"integer"},"network_request_count":{"type":"integer"},"page_urls":{"type":"array","items":{"type":"string"}},"release":{"type":["string","null"]},"retention_expires_at":{"type":["string","null"],"format":"date-time"},"retention_state":{"type":"string","enum":["active","deleted","expired","unknown"]},"sdk_package":{"type":["string","null"]},"sdk_version":{"type":["string","null"]},"segment_count":{"type":"integer"},"segment_reads_allowed":{"type":"boolean"},"session_id":{"type":"string"},"source":{"type":["string","null"]},"started_at":{"type":"string","format":"date-time"},"storage_bytes":{"type":"integer"},"storage_key_prefix":{"type":"string"},"user_id":{"type":["string","null"]},"visitor_id":{"type":["string","null"]}},"required":["session_id","started_at","ended_at","retention_expires_at","retention_state","segment_reads_allowed","deleted_at","deleted_reason","duration_ms","first_url","page_urls","message_count","interaction_count","click_count","keypress_count","mouse_activity_count","active_ms","console_log_count","console_warn_count","console_error_count","network_request_count","network_failed_count","ai_tags","ai_freeform_tags","ai_highlighted","ai_enrichment_status","ai_enriched_at","ai_enrichment_error","source","library","library_version","sdk_package","sdk_version","event_count","error_count","storage_bytes","storage_key_prefix","created_at","segment_count"],"additionalProperties":false},"segments":{"type":"array","items":{"type":"object","properties":{"created_at":{"type":"string","format":"date-time"},"ended_at":{"type":"string","format":"date-time"},"event_count":{"type":"integer"},"segment_index":{"type":"integer"},"size_bytes":{"type":"integer"},"started_at":{"type":"string","format":"date-time"},"storage_key":{"type":"string"}},"required":["created_at","ended_at","event_count","segment_index","size_bytes","started_at","storage_key"],"additionalProperties":false}},"slow_network_ms":{"type":"integer"},"timeline":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","enum":["activity","console","network","page","replay_error","segment"]},"duration_ms":{"type":"integer"},"event_count":{"type":"integer"},"event_id":{"type":"string"},"fingerprint":{"type":"string"},"message":{"type":"string","maxLength":500},"offset_ms":{"type":"integer"},"page_url":{"type":"string"},"request":{"type":"object","properties":{"duration_ms":{"type":"integer"},"method":{"type":["string","null"]},"source":{"type":["string","null"]},"status_code":{"type":["integer","null"]},"url":{"type":"string"}},"additionalProperties":false},"segment_index":{"type":"integer"},"service":{"type":"string"},"severity":{"type":"string","enum":["error","fatal","log","warn"]},"timestamp":{"type":"string","format":"date-time"},"trace_id":{"type":"string"},"type":{"type":"string","enum":["active_window","console_error","console_log","console_warn","inactive_gap","network_failed","network_slow","page_visit","replay_error","segment_boundary"]}},"required":["category","offset_ms","timestamp","type"],"additionalProperties":false}},"truncated":{"type":"boolean"}},"required":["categories","counts","coverage","limit","replay","segments","slow_network_ms","timeline","truncated"],"additionalProperties":false}}}},"404":{"description":"Replay session not found or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Invalid replay inspect parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/replays/{session_id}/events":{"get":{"operationId":"replays.events","summary":"Fetch a replay segment payload from object storage","description":"Fetch a replay segment payload from object storage","tags":["replays"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"session_id","in":"path","required":true,"description":"Replay session UUID returned by replays.search.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/releases":{"get":{"operationId":"releases.list","summary":"List releases (one version of one service in one environment) from deployment records and telemetry, newest first. Needs the `deployments:read` and `errors:read` scopes.","description":"List releases (one version of one service in one environment) from deployment records and telemetry, newest first. Needs the `deployments:read` and `errors:read` scopes.","tags":["releases"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Window start (ISO 8601). Defaults to 30 days before `to`.","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Window end (ISO 8601). Defaults to now. The window is at most 90 days.","schema":{"type":"string","format":"date-time"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"service_name","in":"query","required":false,"description":"Query parameter service_name","schema":{"type":"string"}},{"name":"confidence","in":"query","required":false,"description":"`confirmed` (a deployment record), `detected` (a commit or deployment id in telemetry), or `inferred` (only the service version names it).","schema":{"type":"string","enum":["confirmed","detected","inferred"]}},{"name":"limit","in":"query","required":false,"description":"Most releases to return, 1-100. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/releases/{release_id}":{"get":{"operationId":"releases.get","summary":"Get one release: serving interval, commits, deployments, and health compared with the previous release of the same service and environment. Needs the `deployments:read` and `errors:read` scopes.","description":"Get one release: serving interval, commits, deployments, and health compared with the previous release of the same service and environment. Needs the `deployments:read` and `errors:read` scopes.","tags":["releases"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"release_id","in":"path","required":true,"description":"Release id from releases.list.","schema":{"type":"string","minLength":5,"maxLength":1200}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/reports":{"get":{"operationId":"reports.list","summary":"List the reliability reports (incidents, SLA, MTTR, MTTA, MTTI, MTTD, response time, escalations, issues, heartbeats, SSL certificates) and their sections.","description":"List the reliability reports (incidents, SLA, MTTR, MTTA, MTTI, MTTD, response time, escalations, issues, heartbeats, SSL certificates) and their sections.","tags":["reports"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/reports/{report_id}":{"get":{"operationId":"reports.get","summary":"Run one reliability report over a window. Returns KPIs compared with the previous window of equal length, one chart, and one table.","description":"Run one reliability report over a window. Returns KPIs compared with the previous window of equal length, one chart, and one table.","tags":["reports"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"report_id","in":"path","required":true,"description":"Report id from reports.list.","schema":{"type":"string","enum":["incidents","incidents-per-monitor","manual-incidents","sla","mttr","mttr-per-monitor","mtta","mtta-per-monitor","mtti","mttd","mttd-per-monitor","response-time","escalations","issues","heartbeats","ssl-certificates"]}},{"name":"range","in":"query","required":false,"description":"Preset window: 7d, 30d, 90d, or mtd (month to date). Defaults to 7d.","schema":{"type":"string","enum":["7d","30d","90d","mtd"]}},{"name":"from","in":"query","required":false,"description":"Absolute window start (ISO 8601). Requires `to`; overrides `range`.","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Absolute window end (ISO 8601). Requires `from`.","schema":{"type":"string","format":"date-time"}},{"name":"granularity","in":"query","required":false,"description":"Chart bucket size. Defaults to hour for 2 days or less, day up to 92 days, else week.","schema":{"type":"string","enum":["hour","day","week","month"]}},{"name":"monitor_id","in":"query","required":false,"description":"Narrow the report to one monitor, when the report supports a monitor filter.","schema":{"type":"string"}},{"name":"time_zone","in":"query","required":false,"description":"IANA time zone for preset windows and chart buckets. Defaults to UTC.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/services/catalog":{"get":{"operationId":"services.list","summary":"List services with request rate, error rate, p50/p95/p99 latency, health, and the last release over a window.","description":"List services with request rate, error rate, p50/p95/p99 latency, health, and the last release over a window.","tags":["services"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Window start (ISO 8601). Defaults to 24 hours before `to`.","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Window end (ISO 8601). Defaults to now. The window is at most 7 days.","schema":{"type":"string","format":"date-time"}},{"name":"environment","in":"query","required":false,"description":"Only data from this deployment environment.","schema":{"type":"string"}},{"name":"health","in":"query","required":false,"description":"Only services with this health.","schema":{"type":"string","enum":["healthy","degraded","failing","no_data"]}},{"name":"q","in":"query","required":false,"description":"Only services whose name contains this text.","schema":{"type":"string","maxLength":200}},{"name":"sort","in":"query","required":false,"description":"Sort order. Defaults to count (most requests first).","schema":{"type":"string","enum":["count","error_rate","p95","last_seen"]}},{"name":"limit","in":"query","required":false,"description":"Most services to return, 1-100. Defaults to 100.","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/services/catalog/{service_name}":{"get":{"operationId":"services.get","summary":"Get one service over a window: summary, request series, operations, upstream and downstream services, databases, and releases.","description":"Get one service over a window: summary, request series, operations, upstream and downstream services, databases, and releases.","tags":["services"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"service_name","in":"path","required":true,"description":"The service name, URL-encoded.","schema":{"type":"string","minLength":1,"maxLength":255}},{"name":"from","in":"query","required":false,"description":"Window start (ISO 8601). Defaults to 24 hours before `to`.","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Window end (ISO 8601). Defaults to now. The window is at most 7 days.","schema":{"type":"string","format":"date-time"}},{"name":"environment","in":"query","required":false,"description":"Only data from this deployment environment.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/services/map":{"get":{"operationId":"services.map","summary":"Get the service map: service and database nodes, and call edges with request count, error rate, and latency.","description":"Get the service map: service and database nodes, and call edges with request count, error rate, and latency.","tags":["services"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Window start (ISO 8601). Defaults to 24 hours before `to`.","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Window end (ISO 8601). Defaults to now. The window is at most 7 days.","schema":{"type":"string","format":"date-time"}},{"name":"environment","in":"query","required":false,"description":"Only data from this deployment environment.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/summary-sections":{"get":{"operationId":"summarySections.list","summary":"List the sections of the weekly summary email that cover this project: the built-in sections and the custom report sections of the organization.","description":"List the sections of the weekly summary email that cover this project: the built-in sections and the custom report sections of the organization.","tags":["summarySections"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Summary sections","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"builtin_sections":{"items":{"additionalProperties":false,"properties":{"key":{"type":"string"},"title":{"type":"string"}},"required":["key","title"],"type":"object"},"type":"array"},"sections":{"items":{"additionalProperties":false,"properties":{"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"project_ids":{"description":"Projects the section covers. Empty means every project of the organization.","items":{"format":"uuid","type":"string"},"type":"array"},"report_id":{"description":"Report id from reports.list.","enum":["incidents","incidents-per-monitor","manual-incidents","sla","mttr","mttr-per-monitor","mtta","mtta-per-monitor","mtti","mttd","mttd-per-monitor","response-time","escalations","issues","heartbeats","ssl-certificates"],"type":"string"},"title":{"type":"string"}},"required":["created_at","id","project_ids","report_id","title"],"type":"object"},"type":"array"}},"required":["builtin_sections","sections"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"summarySections.create","summary":"Add a custom section about this project to the weekly summary email. The section runs one reliability report over the summarized week. An organization can have at most 10 custom sections. Body: { title, report_id }","description":"Add a custom section about this project to the weekly summary email. The section runs one reliability report over the summarized week. An organization can have at most 10 custom sections. Body: { title, report_id }","tags":["summarySections"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"report_id":{"description":"Report id from reports.list.","enum":["incidents","incidents-per-monitor","manual-incidents","sla","mttr","mttr-per-monitor","mtta","mtta-per-monitor","mtti","mttd","mttd-per-monitor","response-time","escalations","issues","heartbeats","ssl-certificates"],"type":"string"},"title":{"maxLength":80,"minLength":1,"type":"string"}},"required":["report_id","title"],"type":"object"}}}},"responses":{"201":{"description":"Created section","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"section":{"additionalProperties":false,"properties":{"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"project_ids":{"description":"Projects the section covers. Empty means every project of the organization.","items":{"format":"uuid","type":"string"},"type":"array"},"report_id":{"description":"Report id from reports.list.","enum":["incidents","incidents-per-monitor","manual-incidents","sla","mttr","mttr-per-monitor","mtta","mtta-per-monitor","mtti","mttd","mttd-per-monitor","response-time","escalations","issues","heartbeats","ssl-certificates"],"type":"string"},"title":{"type":"string"}},"required":["created_at","id","project_ids","report_id","title"],"type":"object"}},"required":["section"],"type":"object"}}}},"409":{"description":"The organization already has 10 custom sections","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/summary-sections/{section_id}":{"delete":{"operationId":"summarySections.delete","summary":"Remove a custom section of the weekly summary email. Only a section about exactly this project can be removed here.","description":"Remove a custom section of the weekly summary email. Only a section about exactly this project can be removed here.","tags":["summarySections"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"section_id","in":"path","required":true,"description":"Section id from summarySections.list.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Section removed","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"deleted":{"enum":[true],"type":"boolean"}},"required":["deleted"],"type":"object"}}}},"404":{"description":"No section about this project has this id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/analytics/status":{"get":{"operationId":"analytics.status","summary":"Show whether product analytics is available for this project: plan, launch state, and early access.","description":"Show whether product analytics is available for this project: plan, launch state, and early access.","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/overview":{"get":{"operationId":"analytics.overview","summary":"Web analytics overview from consented product events: visitors, sessions, page views, pages per session, bounce rate, average session length, a traffic series, top pages, entry and exit pages, referrers, channels, UTM values, countries, devices, browsers, and operating systems, with the change against the previous period. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Web analytics overview from consented product events: visitors, sessions, page views, pages per session, bounce rate, average session length, a traffic series, top pages, entry and exit pages, referrers, channels, UTM values, countries, devices, browsers, and operating systems, with the change against the previous period. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"period","in":"query","required":false,"description":"Time window ending now. Ignored when from and to are set. Default 7d.","schema":{"enum":["24h","7d","30d","90d"],"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start of an explicit range (ISO 8601). Set with to; at most 90 days.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End of an explicit range (ISO 8601).","schema":{"format":"date-time","type":"string"}},{"name":"environment","in":"query","required":false,"description":"Only events from this environment.","schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"Filter as dimension:value. Dimensions: page, event, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, os, or prop.<key>. Filters on the same dimension match any value; filters on different dimensions must all match. At most 10. Repeat the parameter for more than one filter.","schema":{"items":{"maxLength":1100,"type":"string"},"maxItems":10,"type":"array"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"maximum":50,"minimum":1,"type":"integer"}}],"responses":{"200":{"description":"Overview","content":{"application/json":{"schema":{"properties":{"breakdowns":{"description":"Top values by visitors for page, entry_page, exit_page, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, and os.","additionalProperties":{"items":{"additionalProperties":false,"properties":{"pageviews":{"minimum":0,"type":"integer","description":"Page views; sessions for channel, entry_page, exit_page."},"value":{"type":"string"},"visitors":{"minimum":0,"type":"integer"}},"required":["pageviews","value","visitors"],"type":"object"},"type":"array"},"type":"object"},"bucket_seconds":{"minimum":0,"type":"integer"},"change":{"description":"Change against the previous period of the same length, in percent.","additionalProperties":{"type":["number","null"]},"type":"object"},"current":{"additionalProperties":false,"properties":{"avg_session_seconds":{"type":["number","null"]},"bounce_rate":{"type":["number","null"],"description":"Percent of sessions with one page view."},"pages_per_session":{"type":["number","null"],"description":"Page views per session."},"pageviews":{"minimum":0,"type":"integer"},"sessions":{"minimum":0,"type":"integer"},"visitors":{"minimum":0,"type":"integer","description":"Approximate unique visitors."}},"required":["avg_session_seconds","bounce_rate","pages_per_session","pageviews","sessions","visitors"],"type":"object"},"from":{"format":"date-time","type":"string"},"previous":{"additionalProperties":false,"properties":{"avg_session_seconds":{"type":["number","null"]},"bounce_rate":{"type":["number","null"],"description":"Percent of sessions with one page view."},"pages_per_session":{"type":["number","null"],"description":"Page views per session."},"pageviews":{"minimum":0,"type":"integer"},"sessions":{"minimum":0,"type":"integer"},"visitors":{"minimum":0,"type":"integer","description":"Approximate unique visitors."}},"required":["avg_session_seconds","bounce_rate","pages_per_session","pageviews","sessions","visitors"],"type":"object"},"series":{"items":{"properties":{"pageviews":{"minimum":0,"type":"integer"},"time":{"format":"date-time","type":"string"},"visitors":{"minimum":0,"type":"integer"}},"required":["pageviews","time","visitors"],"type":"object"},"type":"array"},"to":{"format":"date-time","type":"string"}},"required":["breakdowns","bucket_seconds","change","current","from","previous","series","to"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/events":{"get":{"operationId":"analytics.events","summary":"Product event names with exact counts and visitors, and the newest events. Filter by kind or name, and by filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Product event names with exact counts and visitors, and the newest events. Filter by kind or name, and by filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"period","in":"query","required":false,"description":"Time window ending now. Ignored when from and to are set. Default 7d.","schema":{"enum":["24h","7d","30d","90d"],"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start of an explicit range (ISO 8601). Set with to; at most 90 days.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End of an explicit range (ISO 8601).","schema":{"format":"date-time","type":"string"}},{"name":"environment","in":"query","required":false,"description":"Only events from this environment.","schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"Filter as dimension:value. Dimensions: page, event, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, os, or prop.<key>. Filters on the same dimension match any value; filters on different dimensions must all match. At most 10. Repeat the parameter for more than one filter.","schema":{"items":{"maxLength":1100,"type":"string"},"maxItems":10,"type":"array"}},{"name":"kind","in":"query","required":false,"description":"Query parameter kind","schema":{"enum":["custom","identify","pageview"],"type":"string"}},{"name":"name","in":"query","required":false,"description":"Query parameter name","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"description":"Events","content":{"application/json":{"schema":{"properties":{"events":{"items":{"properties":{"event_id":{"type":"string"},"kind":{"enum":["custom","identify","pageview"],"type":"string"},"name":{"type":"string"},"path":{"type":"string"},"properties":{"additionalProperties":{"type":"string"},"type":"object"},"session_id":{"type":"string"},"timestamp":{"format":"date-time","type":"string"}},"required":["event_id","kind","name","timestamp"],"type":"object"},"type":"array"},"names":{"items":{"properties":{"count":{"minimum":0,"type":"integer"},"kind":{"enum":["custom","identify","pageview"],"type":"string"},"last_seen":{"format":"date-time","type":"string"},"name":{"type":"string"},"visitors":{"minimum":0,"type":"integer"}},"required":["count","kind","last_seen","name","visitors"],"type":"object"},"type":"array"},"total":{"minimum":0,"type":"integer"}},"required":["events","names","total"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/ai-crawlers":{"get":{"operationId":"analytics.aiCrawlers","summary":"Requests from known AI crawlers and AI agents, read from server spans by user agent, with the top paths and a confidence label (verified, mismatch, or user_agent when only the user agent matched). Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Requests from known AI crawlers and AI agents, read from server spans by user agent, with the top paths and a confidence label (verified, mismatch, or user_agent when only the user agent matched). Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"period","in":"query","required":false,"description":"Time window ending now. Ignored when from and to are set. Default 7d.","schema":{"enum":["24h","7d","30d","90d"],"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start of an explicit range (ISO 8601). Set with to; at most 90 days.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End of an explicit range (ISO 8601).","schema":{"format":"date-time","type":"string"}},{"name":"environment","in":"query","required":false,"description":"Only events from this environment.","schema":{"type":"string"}}],"responses":{"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/funnels/run":{"post":{"operationId":"analytics.runFunnel","summary":"Run a funnel: how many people did the steps in order within the window, with the median and 90th percentile time between steps. Visitors who identified count as one person. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Run a funnel: how many people did the steps in order within the window, with the median and 90th percentile time between steps. Visitors who identified count as one person. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"description":"Send steps for an ad hoc funnel, or funnel_id to run a saved funnel.","properties":{"environment":{"type":"string"},"from":{"format":"date-time","type":"string"},"period":{"enum":["24h","7d","30d","90d"],"type":"string"},"filters":{"description":"Filter as dimension:value. Dimensions: page, event, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, os, or prop.<key>. Filters on the same dimension match any value; filters on different dimensions must all match. At most 10.","items":{"maxLength":1100,"type":"string"},"maxItems":10,"type":"array"},"to":{"format":"date-time","type":"string"},"funnel_id":{"format":"uuid","type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"kind":{"enum":["custom","identify","pageview"],"type":"string"},"name":{"description":"Event name. For a page view, the page path (for example /pricing).","maxLength":1024,"minLength":1,"type":"string"}},"required":["kind","name"],"type":"object"},"maxItems":8,"minItems":2,"type":"array"},"window_seconds":{"description":"Time a person has to finish the funnel after the first step. Default 86400.","maximum":2592000,"minimum":60,"type":"integer"}},"type":"object"}}}},"responses":{"200":{"description":"Funnel result","content":{"application/json":{"schema":{"properties":{"from":{"format":"date-time","type":"string"},"steps":{"items":{"properties":{"conversion_from_previous":{"type":["number","null"]},"conversion_from_start":{"type":["number","null"]},"dropped":{"minimum":0,"type":"integer"},"kind":{"enum":["custom","identify","pageview"],"type":"string"},"median_seconds_from_previous":{"type":["number","null"],"description":"Median time from the previous step; null on the first step."},"name":{"type":"string"},"p90_seconds_from_previous":{"type":["number","null"]},"people":{"minimum":0,"type":"integer"}},"required":["conversion_from_previous","conversion_from_start","dropped","kind","median_seconds_from_previous","name","p90_seconds_from_previous","people"],"type":"object"},"type":"array"},"to":{"format":"date-time","type":"string"},"window_seconds":{"minimum":0,"type":"integer"}},"required":["from","steps","to","window_seconds"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/funnels/dropoff-errors":{"post":{"operationId":"analytics.funnelDropoffErrors","summary":"For people who reached a funnel step and did not reach the next one, list the error groups in their sessions, with sample browser session ids and the matching issue. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"For people who reached a funnel step and did not reach the next one, list the error groups in their sessions, with sample browser session ids and the matching issue. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"environment":{"type":"string"},"from":{"format":"date-time","type":"string"},"period":{"enum":["24h","7d","30d","90d"],"type":"string"},"filters":{"description":"Filter as dimension:value. Dimensions: page, event, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, os, or prop.<key>. Filters on the same dimension match any value; filters on different dimensions must all match. At most 10.","items":{"maxLength":1100,"type":"string"},"maxItems":10,"type":"array"},"to":{"format":"date-time","type":"string"},"step_index":{"description":"0-based step people reached before they dropped (not the last step).","minimum":0,"type":"integer"},"steps":{"items":{"additionalProperties":false,"properties":{"kind":{"enum":["custom","identify","pageview"],"type":"string"},"name":{"description":"Event name. For a page view, the page path (for example /pricing).","maxLength":1024,"minLength":1,"type":"string"}},"required":["kind","name"],"type":"object"},"maxItems":8,"minItems":2,"type":"array"},"window_seconds":{"description":"Time a person has to finish the funnel after the first step. Default 86400.","maximum":2592000,"minimum":60,"type":"integer"}},"required":["step_index","steps"],"type":"object"}}}},"responses":{"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/funnels":{"get":{"operationId":"analytics.listFunnels","summary":"List the saved funnels of this project. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"List the saved funnels of this project. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"analytics.createFunnel","summary":"Save a funnel. A project can have at most 50. Body: { name, steps, window_seconds } Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Save a funnel. A project can have at most 50. Body: { name, steps, window_seconds } Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"name":{"maxLength":120,"minLength":1,"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"kind":{"enum":["custom","identify","pageview"],"type":"string"},"name":{"description":"Event name. For a page view, the page path (for example /pricing).","maxLength":1024,"minLength":1,"type":"string"}},"required":["kind","name"],"type":"object"},"maxItems":8,"minItems":2,"type":"array"},"window_seconds":{"description":"Time a person has to finish the funnel after the first step. Default 86400.","maximum":2592000,"minimum":60,"type":"integer"}},"required":["name","steps"],"type":"object"}}}},"responses":{"201":{"description":"Saved funnel","content":{"application/json":{"schema":{"properties":{"funnel":{"properties":{"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"kind":{"enum":["custom","identify","pageview"],"type":"string"},"name":{"description":"Event name. For a page view, the page path (for example /pricing).","maxLength":1024,"minLength":1,"type":"string"}},"required":["kind","name"],"type":"object"},"type":"array"},"updated_at":{"format":"date-time","type":"string"},"window_seconds":{"minimum":0,"type":"integer"}},"required":["created_at","id","name","steps","updated_at","window_seconds"],"type":"object"}},"required":["funnel"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The project already has 50 saved funnels","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/analytics/funnels/{funnel_id}":{"get":{"operationId":"analytics.getFunnel","summary":"Get one saved funnel. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Get one saved funnel. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"funnel_id","in":"path","required":true,"description":"Saved funnel id from analytics.listFunnels.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Saved funnel","content":{"application/json":{"schema":{"properties":{"funnel":{"properties":{"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"kind":{"enum":["custom","identify","pageview"],"type":"string"},"name":{"description":"Event name. For a page view, the page path (for example /pricing).","maxLength":1024,"minLength":1,"type":"string"}},"required":["kind","name"],"type":"object"},"type":"array"},"updated_at":{"format":"date-time","type":"string"},"window_seconds":{"minimum":0,"type":"integer"}},"required":["created_at","id","name","steps","updated_at","window_seconds"],"type":"object"}},"required":["funnel"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"analytics.updateFunnel","summary":"Replace the name, steps, and window of a saved funnel. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Replace the name, steps, and window of a saved funnel. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"funnel_id","in":"path","required":true,"description":"Saved funnel id from analytics.listFunnels.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"name":{"maxLength":120,"minLength":1,"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"kind":{"enum":["custom","identify","pageview"],"type":"string"},"name":{"description":"Event name. For a page view, the page path (for example /pricing).","maxLength":1024,"minLength":1,"type":"string"}},"required":["kind","name"],"type":"object"},"maxItems":8,"minItems":2,"type":"array"},"window_seconds":{"description":"Time a person has to finish the funnel after the first step. Default 86400.","maximum":2592000,"minimum":60,"type":"integer"}},"required":["name","steps"],"type":"object"}}}},"responses":{"200":{"description":"Saved funnel","content":{"application/json":{"schema":{"properties":{"funnel":{"properties":{"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"kind":{"enum":["custom","identify","pageview"],"type":"string"},"name":{"description":"Event name. For a page view, the page path (for example /pricing).","maxLength":1024,"minLength":1,"type":"string"}},"required":["kind","name"],"type":"object"},"type":"array"},"updated_at":{"format":"date-time","type":"string"},"window_seconds":{"minimum":0,"type":"integer"}},"required":["created_at","id","name","steps","updated_at","window_seconds"],"type":"object"}},"required":["funnel"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"analytics.deleteFunnel","summary":"Delete a saved funnel. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Delete a saved funnel. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"funnel_id","in":"path","required":true,"description":"Saved funnel id from analytics.listFunnels.","schema":{"format":"uuid","type":"string"}}],"responses":{"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/analytics/breakdown":{"get":{"operationId":"analytics.breakdown","summary":"One web analytics breakdown with up to 100 rows, by visitors: page, entry_page, exit_page, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, or os. For channel, entry_page, and exit_page, pageviews counts sessions. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"One web analytics breakdown with up to 100 rows, by visitors: page, entry_page, exit_page, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, or os. For channel, entry_page, and exit_page, pageviews counts sessions. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"breakdown","in":"query","required":true,"description":"Query parameter breakdown","schema":{"enum":["page","entry_page","exit_page","referrer","channel","utm_source","utm_medium","utm_campaign","country","device","browser","os"],"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"maximum":100,"minimum":1,"type":"integer"}},{"name":"period","in":"query","required":false,"description":"Time window ending now. Ignored when from and to are set. Default 7d.","schema":{"enum":["24h","7d","30d","90d"],"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start of an explicit range (ISO 8601). Set with to; at most 90 days.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End of an explicit range (ISO 8601).","schema":{"format":"date-time","type":"string"}},{"name":"environment","in":"query","required":false,"description":"Only events from this environment.","schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"Filter as dimension:value. Dimensions: page, event, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, os, or prop.<key>. Filters on the same dimension match any value; filters on different dimensions must all match. At most 10. Repeat the parameter for more than one filter.","schema":{"items":{"maxLength":1100,"type":"string"},"maxItems":10,"type":"array"}}],"responses":{"200":{"description":"Breakdown","content":{"application/json":{"schema":{"properties":{"breakdown":{"enum":["page","entry_page","exit_page","referrer","channel","utm_source","utm_medium","utm_campaign","country","device","browser","os"],"type":"string"},"from":{"format":"date-time","type":"string"},"rows":{"items":{"additionalProperties":false,"properties":{"pageviews":{"minimum":0,"type":"integer","description":"Page views; sessions for channel, entry_page, exit_page."},"value":{"type":"string"},"visitors":{"minimum":0,"type":"integer"}},"required":["pageviews","value","visitors"],"type":"object"},"type":"array"},"to":{"format":"date-time","type":"string"}},"required":["breakdown","from","rows","to"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/live":{"get":{"operationId":"analytics.live","summary":"Visitors, page views, and the most viewed pages in the last 5 minutes. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Visitors, page views, and the most viewed pages in the last 5 minutes. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Only events from this environment.","schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"Filter as dimension:value. Dimensions: page, event, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, os, or prop.<key>. Filters on the same dimension match any value; filters on different dimensions must all match. At most 10. Repeat the parameter for more than one filter.","schema":{"items":{"maxLength":1100,"type":"string"},"maxItems":10,"type":"array"}}],"responses":{"200":{"description":"Live visitors","content":{"application/json":{"schema":{"properties":{"as_of":{"format":"date-time","type":"string"},"pageviews":{"minimum":0,"type":"integer"},"top_pages":{"description":"Most viewed pages in the window.","items":{"type":"string"},"type":"array"},"visitors":{"minimum":0,"type":"integer","description":"Approximate people with any event in the window."},"window_seconds":{"minimum":0,"type":"integer"}},"required":["as_of","pageviews","top_pages","visitors","window_seconds"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/installation":{"get":{"operationId":"analytics.installation","summary":"Check that product events arrive: event counts by kind in the last 24 hours, the page hosts and environments that sent them, and the newest event in the last 90 days. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Check that product events arrive: event counts by kind in the last 24 hours, the page hosts and environments that sent them, and the newest event in the last 90 days. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Installation check","content":{"application/json":{"schema":{"properties":{"custom_events":{"minimum":0,"type":"integer"},"environments":{"items":{"properties":{"events":{"minimum":0,"type":"integer"},"last_seen":{"format":"date-time","type":"string"},"value":{"description":"Page host or environment; empty when not reported.","type":"string"}},"required":["events","last_seen","value"],"type":"object"},"type":"array"},"events":{"minimum":0,"type":"integer"},"hosts":{"items":{"properties":{"events":{"minimum":0,"type":"integer"},"last_seen":{"format":"date-time","type":"string"},"value":{"description":"Page host or environment; empty when not reported.","type":"string"}},"required":["events","last_seen","value"],"type":"object"},"type":"array"},"identify_events":{"minimum":0,"type":"integer"},"last_event_at":{"type":["string","null"],"description":"Newest event in the last 90 days, or null when there is none.","format":"date-time"},"pageviews":{"minimum":0,"type":"integer"},"receiving":{"description":"True when events arrived in the window.","type":"boolean"},"window_seconds":{"minimum":0,"type":"integer"}},"required":["custom_events","environments","events","hosts","identify_events","last_event_at","pageviews","receiving","window_seconds"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/properties":{"get":{"operationId":"analytics.properties","summary":"The property keys of one event name, with their most common values and event counts. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"The property keys of one event name, with their most common values and event counts. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"event","in":"query","required":true,"description":"Event name.","schema":{"type":"string"}},{"name":"period","in":"query","required":false,"description":"Time window ending now. Ignored when from and to are set. Default 7d.","schema":{"enum":["24h","7d","30d","90d"],"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start of an explicit range (ISO 8601). Set with to; at most 90 days.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End of an explicit range (ISO 8601).","schema":{"format":"date-time","type":"string"}},{"name":"environment","in":"query","required":false,"description":"Only events from this environment.","schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"Filter as dimension:value. Dimensions: page, event, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, os, or prop.<key>. Filters on the same dimension match any value; filters on different dimensions must all match. At most 10. Repeat the parameter for more than one filter.","schema":{"items":{"maxLength":1100,"type":"string"},"maxItems":10,"type":"array"}}],"responses":{"200":{"description":"Event properties","content":{"application/json":{"schema":{"properties":{"event":{"type":"string"},"from":{"format":"date-time","type":"string"},"keys":{"items":{"properties":{"events":{"minimum":0,"type":"integer"},"key":{"type":"string"},"values":{"items":{"properties":{"events":{"minimum":0,"type":"integer"},"value":{"type":"string"}},"required":["events","value"],"type":"object"},"type":"array"}},"required":["events","key","values"],"type":"object"},"type":"array"},"to":{"format":"date-time","type":"string"},"total_events":{"minimum":0,"type":"integer"}},"required":["event","from","keys","to","total_events"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/goals/conversions":{"get":{"operationId":"analytics.goalConversions","summary":"For each goal of the project: visitors who completed it, matching events, and the conversion rate against all visitors in the range. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"For each goal of the project: visitors who completed it, matching events, and the conversion rate against all visitors in the range. Accepts filters. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"period","in":"query","required":false,"description":"Time window ending now. Ignored when from and to are set. Default 7d.","schema":{"enum":["24h","7d","30d","90d"],"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start of an explicit range (ISO 8601). Set with to; at most 90 days.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End of an explicit range (ISO 8601).","schema":{"format":"date-time","type":"string"}},{"name":"environment","in":"query","required":false,"description":"Only events from this environment.","schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"Filter as dimension:value. Dimensions: page, event, referrer, channel, utm_source, utm_medium, utm_campaign, country, device, browser, os, or prop.<key>. Filters on the same dimension match any value; filters on different dimensions must all match. At most 10. Repeat the parameter for more than one filter.","schema":{"items":{"maxLength":1100,"type":"string"},"maxItems":10,"type":"array"}}],"responses":{"200":{"description":"Goal conversions","content":{"application/json":{"schema":{"properties":{"from":{"format":"date-time","type":"string"},"goals":{"items":{"properties":{"completions":{"minimum":0,"type":"integer","description":"Matching events."},"conversion_rate":{"type":["number","null"],"description":"Percent of visitors who converted."},"conversions":{"minimum":0,"type":"integer","description":"Visitors who completed the goal."},"goal_id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"required":["completions","conversion_rate","conversions","goal_id","name"],"type":"object"},"type":"array"},"to":{"format":"date-time","type":"string"},"visitors":{"minimum":0,"type":"integer"}},"required":["from","goals","to","visitors"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/goals":{"get":{"operationId":"analytics.listGoals","summary":"List the conversion goals of this project. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"List the conversion goals of this project. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Goals","content":{"application/json":{"schema":{"properties":{"goals":{"items":{"properties":{"created_at":{"format":"date-time","type":"string"},"event_name":{"type":["string","null"],"description":"Event goals: the event name."},"id":{"format":"uuid","type":"string"},"kind":{"enum":["event","page"],"type":"string"},"name":{"type":"string"},"path_pattern":{"type":["string","null"],"description":"Page goals: the path pattern, where * matches any characters."},"property_key":{"type":["string","null"]},"property_value":{"type":["string","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["created_at","event_name","id","kind","name","path_pattern","property_key","property_value","updated_at"],"type":"object"},"type":"array"}},"required":["goals"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"analytics.createGoal","summary":"Create a conversion goal. A project can have at most 50. Body: { kind: \"event\", name, event_name, property_key?, property_value? } or { kind: \"page\", name, path_pattern } Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Create a conversion goal. A project can have at most 50. Body: { kind: \"event\", name, event_name, property_key?, property_value? } or { kind: \"page\", name, path_pattern } Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"An event goal (event name, with an optional property key and value set together) or a page goal (path pattern).","oneOf":[{"additionalProperties":false,"properties":{"event_name":{"maxLength":200,"minLength":1,"type":"string"},"kind":{"enum":["event"],"type":"string"},"name":{"maxLength":120,"minLength":1,"type":"string"},"property_key":{"pattern":"^[\\w$.-]{1,64}$","type":"string"},"property_value":{"maxLength":1024,"minLength":1,"type":"string"}},"required":["event_name","kind","name"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"enum":["page"],"type":"string"},"name":{"maxLength":120,"minLength":1,"type":"string"},"path_pattern":{"description":"Starts with /; * matches any characters, for example /blog/*.","maxLength":1024,"minLength":1,"pattern":"^/","type":"string"}},"required":["kind","name","path_pattern"],"type":"object"}],"type":"object"}}}},"responses":{"201":{"description":"Goal","content":{"application/json":{"schema":{"properties":{"goal":{"properties":{"created_at":{"format":"date-time","type":"string"},"event_name":{"type":["string","null"],"description":"Event goals: the event name."},"id":{"format":"uuid","type":"string"},"kind":{"enum":["event","page"],"type":"string"},"name":{"type":"string"},"path_pattern":{"type":["string","null"],"description":"Page goals: the path pattern, where * matches any characters."},"property_key":{"type":["string","null"]},"property_value":{"type":["string","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["created_at","event_name","id","kind","name","path_pattern","property_key","property_value","updated_at"],"type":"object"}},"required":["goal"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"The project already has 50 goals","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/analytics/goals/{goal_id}":{"get":{"operationId":"analytics.getGoal","summary":"Get one conversion goal. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Get one conversion goal. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"goal_id","in":"path","required":true,"description":"Goal id from analytics.listGoals.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Goal","content":{"application/json":{"schema":{"properties":{"goal":{"properties":{"created_at":{"format":"date-time","type":"string"},"event_name":{"type":["string","null"],"description":"Event goals: the event name."},"id":{"format":"uuid","type":"string"},"kind":{"enum":["event","page"],"type":"string"},"name":{"type":"string"},"path_pattern":{"type":["string","null"],"description":"Page goals: the path pattern, where * matches any characters."},"property_key":{"type":["string","null"]},"property_value":{"type":["string","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["created_at","event_name","id","kind","name","path_pattern","property_key","property_value","updated_at"],"type":"object"}},"required":["goal"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"analytics.updateGoal","summary":"Replace a conversion goal. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Replace a conversion goal. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"goal_id","in":"path","required":true,"description":"Goal id from analytics.listGoals.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"An event goal (event name, with an optional property key and value set together) or a page goal (path pattern).","oneOf":[{"additionalProperties":false,"properties":{"event_name":{"maxLength":200,"minLength":1,"type":"string"},"kind":{"enum":["event"],"type":"string"},"name":{"maxLength":120,"minLength":1,"type":"string"},"property_key":{"pattern":"^[\\w$.-]{1,64}$","type":"string"},"property_value":{"maxLength":1024,"minLength":1,"type":"string"}},"required":["event_name","kind","name"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"enum":["page"],"type":"string"},"name":{"maxLength":120,"minLength":1,"type":"string"},"path_pattern":{"description":"Starts with /; * matches any characters, for example /blog/*.","maxLength":1024,"minLength":1,"pattern":"^/","type":"string"}},"required":["kind","name","path_pattern"],"type":"object"}],"type":"object"}}}},"responses":{"200":{"description":"Goal","content":{"application/json":{"schema":{"properties":{"goal":{"properties":{"created_at":{"format":"date-time","type":"string"},"event_name":{"type":["string","null"],"description":"Event goals: the event name."},"id":{"format":"uuid","type":"string"},"kind":{"enum":["event","page"],"type":"string"},"name":{"type":"string"},"path_pattern":{"type":["string","null"],"description":"Page goals: the path pattern, where * matches any characters."},"property_key":{"type":["string","null"]},"property_value":{"type":["string","null"]},"updated_at":{"format":"date-time","type":"string"}},"required":["created_at","event_name","id","kind","name","path_pattern","property_key","property_value","updated_at"],"type":"object"}},"required":["goal"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"analytics.deleteGoal","summary":"Delete a conversion goal. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Delete a conversion goal. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"goal_id","in":"path","required":true,"description":"Goal id from analytics.listGoals.","schema":{"format":"uuid","type":"string"}}],"responses":{"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/analytics/identities/export":{"get":{"operationId":"analytics.exportIdentity","summary":"Export consented product events and identity mappings for one distinct or account id in bounded pages. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Export consented product events and identity mappings for one distinct or account id in bounded pages. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"distinct_id","in":"query","required":false,"description":"Query parameter distinct_id","schema":{"type":"string"}},{"name":"account_id","in":"query","required":false,"description":"Query parameter account_id","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Query parameter cursor","schema":{"type":"string"}}],"responses":{"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/analytics/identities":{"delete":{"operationId":"analytics.deleteIdentity","summary":"Idempotently delete consented product events and identity mappings for one distinct or account id. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Idempotently delete consented product events and identity mappings for one distinct or account id. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["analytics"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"distinct_id","in":"query","required":false,"description":"Query parameter distinct_id","schema":{"type":"string"}},{"name":"account_id","in":"query","required":false,"description":"Query parameter account_id","schema":{"type":"string"}}],"responses":{"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/revenue/status":{"get":{"operationId":"revenue.status","summary":"Revenue setup check: the Stripe connection, webhook and backfill state, recorded events, whether reports are up to date, links to analytics people, and reference rates. Each check says what to do next. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Revenue setup check: the Stripe connection, webhook and backfill state, recorded events, whether reports are up to date, links to analytics people, and reference rates. Each check says what to do next. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Revenue status","content":{"application/json":{"schema":{"properties":{"checks":{"items":{"properties":{"id":{"type":"string"},"message":{"type":"string"},"status":{"enum":["fail","ok","pending","warn"],"type":"string"}},"required":["id","message","status"],"type":"object"},"type":"array"},"ledger":{"type":"object"},"reporting_currency":{"type":"string"},"stripe":{"type":["object","null"]}},"required":["checks","ledger","reporting_currency","stripe"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/revenue/overview":{"get":{"operationId":"revenue.overview","summary":"Gross revenue, refunds, disputes, net revenue, payments, paying and new customers, a series, and breakdowns by currency and plan, in the reporting currency (daily reference rates), with the previous period. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Gross revenue, refunds, disputes, net revenue, payments, paying and new customers, a series, and breakdowns by currency and plan, in the reporting currency (daily reference rates), with the previous period. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start (ISO 8601). Default: 30 days before `to`. At most 400 days before `to`.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End (ISO 8601). Default: now.","schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"description":"Revenue overview","content":{"application/json":{"schema":{"properties":{"by_currency":{"items":{"type":"object"},"type":"array"},"by_plan":{"items":{"properties":{"net":{"description":"Decimal amount in the reporting currency.","type":"number"},"payments":{"minimum":0,"type":"integer"},"plan":{"type":"string"}},"required":["net","payments","plan"],"type":"object"},"type":"array"},"currency":{"type":"string"},"from":{"format":"date-time","type":"string"},"fx":{"properties":{"last_rate_date":{"type":["string","null"]},"missing_currencies":{"items":{"type":"string"},"type":"array"},"source":{"enum":["ecb"],"type":"string"}},"required":["last_rate_date","missing_currencies","source"],"type":"object"},"previous":{"type":["object","null"]},"series":{"items":{"properties":{"bucket":{"type":"string"},"gross":{"description":"Decimal amount in the reporting currency.","type":"number"},"net":{"description":"Decimal amount in the reporting currency.","type":"number"},"refunds":{"description":"Decimal amount in the reporting currency.","type":"number"}},"required":["bucket","gross","net","refunds"],"type":"object"},"type":"array"},"to":{"format":"date-time","type":"string"},"totals":{"properties":{"disputes":{"description":"Decimal amount in the reporting currency.","type":"number"},"gross":{"description":"Decimal amount in the reporting currency.","type":"number"},"identified_share":{"type":["number","null"]},"net":{"description":"Decimal amount in the reporting currency.","type":"number"},"new_customers":{"minimum":0,"type":"integer","description":"Paying customers whose first payment is in the range."},"paying_customers":{"minimum":0,"type":"integer","description":"Distinct payers in the range, by customer id, else by distinct id, else by anonymous id. Payments without any of these ids are left out."},"payments":{"minimum":0,"type":"integer"},"refunds":{"description":"Decimal amount in the reporting currency.","type":"number"}},"required":["gross","net","refunds","disputes","payments","paying_customers"],"type":"object"}},"required":["by_currency","by_plan","currency","from","fx","series","to","totals"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/revenue/mrr":{"get":{"operationId":"revenue.mrr","summary":"Monthly recurring revenue at the start and end of the range, the movements between (new, expansion, contraction, churn, reactivation), and a series, in the reporting currency. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Monthly recurring revenue at the start and end of the range, the movements between (new, expansion, contraction, churn, reactivation), and a series, in the reporting currency. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start (ISO 8601). Default: 30 days before `to`. At most 400 days before `to`.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End (ISO 8601). Default: now.","schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"description":"MRR","content":{"application/json":{"schema":{"properties":{"currency":{"type":"string"},"end_mrr":{"description":"Decimal amount in the reporting currency.","type":"number"},"from":{"format":"date-time","type":"string"},"fx":{"properties":{"last_rate_date":{"type":["string","null"]},"missing_currencies":{"items":{"type":"string"},"type":"array"},"source":{"enum":["ecb"],"type":"string"}},"required":["last_rate_date","missing_currencies","source"],"type":"object"},"movements":{"properties":{"churn":{"properties":{"amount":{"description":"Decimal amount in the reporting currency.","type":"number"},"customers":{"minimum":0,"type":"integer"}},"required":["amount","customers"],"type":"object"},"contraction":{"properties":{"amount":{"description":"Decimal amount in the reporting currency.","type":"number"},"customers":{"minimum":0,"type":"integer"}},"required":["amount","customers"],"type":"object"},"expansion":{"properties":{"amount":{"description":"Decimal amount in the reporting currency.","type":"number"},"customers":{"minimum":0,"type":"integer"}},"required":["amount","customers"],"type":"object"},"new":{"properties":{"amount":{"description":"Decimal amount in the reporting currency.","type":"number"},"customers":{"minimum":0,"type":"integer"}},"required":["amount","customers"],"type":"object"},"reactivation":{"properties":{"amount":{"description":"Decimal amount in the reporting currency.","type":"number"},"customers":{"minimum":0,"type":"integer"}},"required":["amount","customers"],"type":"object"}},"required":["churn","contraction","expansion","new","reactivation"],"type":"object"},"net_new_mrr":{"description":"Decimal amount in the reporting currency.","type":"number"},"series":{"items":{"type":"object"},"type":"array"},"start_mrr":{"description":"Decimal amount in the reporting currency.","type":"number"},"subscribers":{"minimum":0,"type":"integer"},"to":{"format":"date-time","type":"string"}},"required":["currency","end_mrr","movements","net_new_mrr","start_mrr","subscribers"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/revenue/impact":{"get":{"operationId":"revenue.impact","summary":"Estimated revenue at risk for an issue, an incident, a release, or a slow page, as a range in the reporting currency. Issues and pages: the last 30 days of net revenue of the identified people whose sessions had the problem, extrapolated to all affected sessions for the high end. Incidents and releases: net revenue in the window (at most 7 days) against the same window in each of the four weeks before. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Estimated revenue at risk for an issue, an incident, a release, or a slow page, as a range in the reporting currency. Issues and pages: the last 30 days of net revenue of the identified people whose sessions had the problem, extrapolated to all affected sessions for the high end. Incidents and releases: net revenue in the window (at most 7 days) against the same window in each of the four weeks before. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"target","in":"query","required":true,"description":"Query parameter target","schema":{"enum":["issue","incident","release","page"],"type":"string"}},{"name":"id","in":"query","required":true,"description":"Issue id, incident id, release id, or (for `page`) the page path, for example `/checkout`.","schema":{"maxLength":500,"minLength":1,"type":"string"}}],"responses":{"200":{"description":"Revenue impact","content":{"application/json":{"schema":{"properties":{"affected":{"properties":{"identified_sessions":{"minimum":0,"type":"integer"},"paying_people":{"minimum":0,"type":"integer"},"sessions":{"minimum":0,"type":"integer"}},"required":["identified_sessions","paying_people","sessions"],"type":["object","null"]},"baseline":{"properties":{"expected":{"description":"Decimal amount in the reporting currency.","type":"number"},"observed":{"description":"Decimal amount in the reporting currency.","type":"number"},"prior":{"items":{"description":"Decimal amount in the reporting currency.","type":"number"},"type":"array"}},"required":["expected","observed","prior"],"type":["object","null"]},"currency":{"type":"string"},"from":{"format":"date-time","type":"string"},"high":{"description":"Decimal amount in the reporting currency.","type":"number"},"low":{"description":"Decimal amount in the reporting currency.","type":"number"},"method":{"enum":["affected_people","baseline"],"type":"string"},"missing_currencies":{"items":{"type":"string"},"type":"array"},"status":{"enum":["estimated","no_identity","no_revenue","no_sessions"],"type":"string"},"target":{"enum":["issue","incident","release","page"],"type":"string"},"target_id":{"type":"string"},"to":{"format":"date-time","type":"string"}},"required":["affected","baseline","currency","from","high","low","method","missing_currencies","status","target","target_id","to"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/revenue/attribution":{"get":{"operationId":"revenue.attribution","summary":"Net revenue by the source, medium, or campaign of the touch that brought each paying person, in the reporting currency. A touch is a consented page view or event with UTM parameters, an ad click id, or an external referrer, read up to 90 days before the range; identify links up to 400 days before it. `first_touch` credits the oldest touch of the person; `last_touch` the newest touch before each payment. Payments without an analytics id are `unlinked`; linked people without a touch are `direct`. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Net revenue by the source, medium, or campaign of the touch that brought each paying person, in the reporting currency. A touch is a consented page view or event with UTM parameters, an ad click id, or an external referrer, read up to 90 days before the range; identify links up to 400 days before it. `first_touch` credits the oldest touch of the person; `last_touch` the newest touch before each payment. Payments without an analytics id are `unlinked`; linked people without a touch are `direct`. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start (ISO 8601). Default: 30 days before `to`. At most 400 days before `to`.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End (ISO 8601). Default: now.","schema":{"format":"date-time","type":"string"}},{"name":"model","in":"query","required":false,"description":"Attribution model. Default: `last_touch`.","schema":{"enum":["first_touch","last_touch"],"type":"string"}},{"name":"dimension","in":"query","required":false,"description":"The touch field to group by. Default: `source`.","schema":{"enum":["source","medium","campaign"],"type":"string"}}],"responses":{"200":{"description":"Revenue attribution","content":{"application/json":{"schema":{"properties":{"currency":{"type":"string"},"dimension":{"enum":["source","medium","campaign"],"type":"string"},"from":{"format":"date-time","type":"string"},"lookback_days":{"minimum":0,"type":"integer"},"missing_currencies":{"items":{"type":"string"},"type":"array"},"model":{"enum":["first_touch","last_touch"],"type":"string"},"rows":{"items":{"properties":{"kind":{"enum":["touch","direct","unlinked"],"type":"string"},"net":{"description":"Decimal amount in the reporting currency.","type":"number"},"payments":{"minimum":0,"type":"integer"},"people":{"minimum":0,"type":"integer"},"share":{"description":"Percent of the net revenue in the window.","type":["number","null"]},"value":{"type":"string"}},"required":["kind","net","payments","people","share","value"],"type":"object"},"type":"array"},"to":{"format":"date-time","type":"string"},"total_net":{"description":"Decimal amount in the reporting currency.","type":"number"},"truncated":{"type":"boolean"}},"required":["currency","dimension","from","lookback_days","missing_currencies","model","rows","to","total_net","truncated"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"`RANGE_TOO_LARGE`: the range has too many events to attribute in one request; narrow `from` and `to`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/revenue/events":{"get":{"operationId":"revenue.listEvents","summary":"Ledger rows (payments, refunds, disputes), newest first. One row per provider object; refunds and disputes are their own negative rows. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Ledger rows (payments, refunds, disputes), newest first. One row per provider object; refunds and disputes are their own negative rows. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start (ISO 8601). Default: 30 days before `to`. At most 400 days before `to`.","schema":{"format":"date-time","type":"string"}},{"name":"to","in":"query","required":false,"description":"End (ISO 8601). Default: now.","schema":{"format":"date-time","type":"string"}},{"name":"kind","in":"query","required":false,"description":"Query parameter kind","schema":{"enum":["payment","refund","dispute","dispute_reversal"],"type":"string"}},{"name":"customer_id","in":"query","required":false,"description":"Query parameter customer_id","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"maximum":200,"minimum":1,"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Ledger rows","content":{"application/json":{"schema":{"properties":{"events":{"items":{"properties":{"amount_minor":{"description":"Signed amount in the smallest unit of `currency`.","type":"integer"},"anonymous_id":{"type":["string","null"]},"currency":{"type":"string"},"currency_exponent":{"minimum":0,"type":"integer"},"customer_id":{"type":["string","null"]},"distinct_id":{"type":["string","null"]},"id":{"format":"uuid","type":"string"},"kind":{"enum":["payment","refund","dispute","dispute_reversal"],"type":"string"},"object_id":{"description":"The provider object or your own id.","type":"string"},"occurred_at":{"format":"date-time","type":"string"},"parent_object_id":{"type":["string","null"]},"plan":{"type":["string","null"]},"recurring":{"type":"boolean"},"source":{"enum":["api","stripe"],"type":"string"},"status":{"enum":["posted","voided"],"type":"string"},"subscription_id":{"type":["string","null"]}},"required":["amount_minor","currency","id","kind","object_id","occurred_at","source","status"],"type":"object"},"type":"array"},"next_cursor":{"type":["string","null"]}},"required":["events","next_cursor"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"revenue.sendEvents","summary":"Record up to 100 money movements from your server (a billing system without a connected provider). Idempotent by `id`: sending the same id again replaces it. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Record up to 100 money movements from your server (a billing system without a connected provider). Idempotent by `id`: sending the same id again replaces it. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"events":{"items":{"additionalProperties":false,"properties":{"amount":{"description":"Positive amount in the smallest currency unit; `type` sets the sign.","minimum":0,"type":"integer"},"anonymous_id":{"maxLength":200,"minLength":1,"type":"string"},"currency":{"pattern":"^[A-Za-z]{3}$","type":"string"},"customer_id":{"maxLength":200,"minLength":1,"type":"string"},"distinct_id":{"maxLength":200,"minLength":1,"type":"string","description":"The user id you pass to identify()."},"id":{"description":"Your id of the money movement. Sending it again replaces it.","maxLength":255,"minLength":1,"type":"string"},"occurred_at":{"format":"date-time","type":"string"},"parent_id":{"description":"The payment id that a refund or dispute belongs to.","maxLength":255,"type":"string"},"plan":{"maxLength":200,"minLength":1,"type":"string"},"recurring":{"type":"boolean"},"status":{"enum":["posted","voided"],"type":"string"},"subscription_id":{"maxLength":200,"minLength":1,"type":"string"},"type":{"enum":["payment","refund","dispute","dispute_reversal"],"type":"string"}},"required":["amount","currency","id","occurred_at","type"],"type":"object"},"maxItems":100,"minItems":1,"type":"array"}},"required":["events"],"type":"object"}}}},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"properties":{"accepted":{"minimum":0,"type":"integer"},"written":{"minimum":0,"type":"integer"}},"required":["accepted","written"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/revenue/subscriptions":{"post":{"operationId":"revenue.sendSubscriptions","summary":"Record up to 100 subscription states (monthly recurring revenue from a time on) from your server. Idempotent per subscription id and effective time. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Record up to 100 subscription states (monthly recurring revenue from a time on) from your server. Idempotent per subscription id and effective time. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"subscriptions":{"items":{"additionalProperties":false,"properties":{"currency":{"pattern":"^[A-Za-z]{3}$","type":"string"},"customer_id":{"maxLength":200,"minLength":1,"type":"string"},"effective_at":{"format":"date-time","type":"string"},"id":{"maxLength":255,"minLength":1,"type":"string"},"mrr":{"description":"Monthly recurring revenue in the smallest currency unit; 0 when it does not pay.","minimum":0,"type":"integer"},"plan":{"maxLength":200,"minLength":1,"type":"string"},"status":{"maxLength":24,"minLength":1,"type":"string"}},"required":["currency","effective_at","id","mrr","status"],"type":"object"},"maxItems":100,"minItems":1,"type":"array"}},"required":["subscriptions"],"type":"object"}}}},"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"properties":{"accepted":{"minimum":0,"type":"integer"},"written":{"minimum":0,"type":"integer"}},"required":["accepted","written"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/revenue/settings":{"get":{"operationId":"revenue.getSettings","summary":"The reporting currency of revenue reports. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"The reporting currency of revenue reports. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Settings","content":{"application/json":{"schema":{"properties":{"reporting_currency":{"type":"string"},"updated_at":{"type":["string","null"]}},"required":["reporting_currency","updated_at"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"revenue.updateSettings","summary":"Set the reporting currency (ISO 4217 code) of revenue reports. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","description":"Set the reporting currency (ISO 4217 code) of revenue reports. Needs product analytics on the plan; while product analytics is coming soon, only projects with early access can use it (403 with code plan_upgrade_required or coming_soon otherwise).","tags":["revenue"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"reporting_currency":{"pattern":"^[A-Za-z]{3}$","type":"string"}},"required":["reporting_currency"],"type":"object"}}}},"responses":{"200":{"description":"Settings","content":{"application/json":{"schema":{"properties":{"reporting_currency":{"type":"string"},"updated_at":{"type":["string","null"]}},"required":["reporting_currency","updated_at"],"type":"object"}}}},"403":{"description":"Not on the plan or not available yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/remote-access/targets":{"get":{"operationId":"remoteAccess.targets.list","summary":"List sanitized verified targets available to the caller","description":"List sanitized verified targets available to the caller","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Remote access targets","content":{"application/json":{"schema":{"type":"object","properties":{"targets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"label":{"type":"string"},"environment":{"type":"string"},"enabled":{"type":"boolean"},"runner_version":{"type":["string","null"]},"verified_at":{"type":["string","null"],"format":"date-time"}},"required":["id","label","environment","enabled","runner_version","verified_at"],"additionalProperties":false}}},"required":["targets"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"remoteAccess.targets.create","summary":"Create an unverified target intent bound to a connector","description":"Create an unverified target intent bound to a connector","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":120},"environment":{"type":"string","minLength":1,"maxLength":64},"connector_id":{"type":"string","format":"uuid"},"auth_profile_id":{"type":"string","minLength":1,"maxLength":120},"policy":{"type":"object","properties":{"allowed_operations":{"type":"array","items":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]}},"max_output_bytes":{"type":"integer","minimum":1,"maximum":10485760},"max_timeout_seconds":{"type":"integer","minimum":1,"maximum":300}},"required":["allowed_operations","max_output_bytes","max_timeout_seconds"],"additionalProperties":false}},"required":["label","environment","connector_id","auth_profile_id","policy"],"additionalProperties":false}}}},"responses":{"201":{"description":"Unverified target with connector verification request","content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"label":{"type":"string"},"environment":{"type":"string"},"enabled":{"type":"boolean"},"runner_version":{"type":["string","null"]},"verified_at":{"type":["string","null"],"format":"date-time"},"connector_id":{"type":"string","format":"uuid"}},"required":["id","label","environment","enabled","runner_version","verified_at","connector_id"],"additionalProperties":false},"verification_request":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"expires_at":{"type":"string","format":"date-time"}},"required":["id","expires_at"],"additionalProperties":false}},"required":["target","verification_request"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/remote-access/requests/preview":{"post":{"operationId":"remoteAccess.requests.preview","summary":"Evaluate an exact typed operation without creating or executing it","description":"Evaluate an exact typed operation without creating or executing it","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target_id":{"type":"string","format":"uuid"},"operation":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","enum":["host.disk_usage"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.kernel"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.load"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.time"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["service.restart"]},"parameters":{"type":"object","properties":{"unit":{"type":"string","minLength":1,"maxLength":128}},"required":["unit"],"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["service.status"]},"parameters":{"type":"object","properties":{"unit":{"type":"string","minLength":1,"maxLength":128}},"required":["unit"],"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false}]},"timeout_seconds":{"type":"integer","minimum":1,"maximum":300}},"required":["target_id","operation","timeout_seconds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Policy decision","content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["deny","execute","request_approval"]},"code":{"type":"string","enum":["approval_required","invalid_timeout","operation_not_allowed","policy_allows_execution","remediation_disabled"]},"message":{"type":"string"},"mode":{"type":"string","enum":["observe","remediate"]}},"required":["action","code","message","mode"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/requests":{"post":{"operationId":"remoteAccess.requests.create","summary":"Create an idempotent typed remote operation request","description":"Create an idempotent typed remote operation request","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target_id":{"type":"string","format":"uuid"},"operation":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","enum":["host.disk_usage"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.kernel"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.load"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.time"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["service.restart"]},"parameters":{"type":"object","properties":{"unit":{"type":"string","minLength":1,"maxLength":128}},"required":["unit"],"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["service.status"]},"parameters":{"type":"object","properties":{"unit":{"type":"string","minLength":1,"maxLength":128}},"required":["unit"],"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false}]},"timeout_seconds":{"type":"integer","minimum":1,"maximum":300}},"required":["target_id","operation","timeout_seconds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Existing idempotent request","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"target_id":{"type":"string","format":"uuid"},"operation_id":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]},"status":{"type":"string","enum":["approved","cancelled","denied","expired","pending"]},"timeout_seconds":{"type":"integer"},"max_output_bytes":{"type":"integer"},"expires_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","target_id","operation_id","status","timeout_seconds","max_output_bytes","expires_at","created_at","updated_at"],"additionalProperties":false}}}},"201":{"description":"Request created","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"target_id":{"type":"string","format":"uuid"},"operation_id":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]},"status":{"type":"string","enum":["approved","cancelled","denied","expired","pending"]},"timeout_seconds":{"type":"integer"},"max_output_bytes":{"type":"integer"},"expires_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","target_id","operation_id","status","timeout_seconds","max_output_bytes","expires_at","created_at","updated_at"],"additionalProperties":false}}}},"409":{"description":"Idempotency key conflicts with another request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Request rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"},"get":{"operationId":"remoteAccess.requests.list","summary":"List sanitized project request state for remote access administrators","description":"List sanitized project request state for remote access administrators","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Remote access requests","content":{"application/json":{"schema":{"type":"object","properties":{"requests":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"target_id":{"type":"string","format":"uuid"},"operation_id":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]},"status":{"type":"string","enum":["approved","cancelled","denied","expired","pending"]},"timeout_seconds":{"type":"integer"},"max_output_bytes":{"type":"integer"},"expires_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","target_id","operation_id","status","timeout_seconds","max_output_bytes","expires_at","created_at","updated_at"],"additionalProperties":false}}},"required":["requests"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/requests/{request_id}":{"get":{"operationId":"remoteAccess.requests.get","summary":"Get owner-bound request state and bounded redacted command output with remote_access:request","description":"Get owner-bound request state and bounded redacted command output with remote_access:request","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"request_id","in":"path","required":true,"description":"Path parameter request_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Remote access request","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"target_id":{"type":"string","format":"uuid"},"operation_id":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]},"status":{"type":"string","enum":["approved","cancelled","denied","expired","pending"]},"timeout_seconds":{"type":"integer"},"max_output_bytes":{"type":"integer"},"expires_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"execution":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"request_id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["failed","running","succeeded","timed_out"]},"error_code":{"type":["string","null"]},"exit_code":{"type":["integer","null"]},"output_bytes":{"type":"integer"},"output_truncated":{"type":"boolean"},"started_at":{"type":"string","format":"date-time"},"finished_at":{"type":["string","null"],"format":"date-time"},"redacted_output":{"anyOf":[{"type":"object","properties":{"content":{"type":"string","maxLength":65536},"trust":{"type":"string","enum":["untrusted_remote_output"]},"truncated":{"type":"boolean"}},"required":["content","trust","truncated"],"additionalProperties":false},{"type":"null"}]}},"required":["id","request_id","status","error_code","exit_code","output_bytes","output_truncated","started_at","finished_at","redacted_output"],"additionalProperties":false},{"type":"null"}]}},"required":["id","target_id","operation_id","status","timeout_seconds","max_output_bytes","expires_at","created_at","updated_at","execution"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/requests/{request_id}/cancel":{"post":{"operationId":"remoteAccess.requests.cancel","summary":"Cancel pending or approved work before execution starts; running work is not interrupted","description":"Cancel pending or approved work before execution starts; running work is not interrupted","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"request_id","in":"path","required":true,"description":"Path parameter request_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Cancelled request","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"target_id":{"type":"string","format":"uuid"},"operation_id":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]},"status":{"type":"string","enum":["approved","cancelled","denied","expired","pending"]},"timeout_seconds":{"type":"integer"},"max_output_bytes":{"type":"integer"},"expires_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","target_id","operation_id","status","timeout_seconds","max_output_bytes","expires_at","created_at","updated_at"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"write"}},"/v1/projects/{project_id}/remote-access/setup-targets":{"get":{"operationId":"remoteAccess.targets.listSetup","summary":"List sanitized targets in all setup states for project administrators","description":"List sanitized targets in all setup states for project administrators","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Sanitized setup targets","content":{"application/json":{"schema":{"type":"object","properties":{"targets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"label":{"type":"string"},"environment":{"type":"string"},"enabled":{"type":"boolean"},"runner_version":{"type":["string","null"]},"verified_at":{"type":["string","null"],"format":"date-time"},"connector_id":{"type":"string","format":"uuid"}},"required":["id","label","environment","enabled","runner_version","verified_at","connector_id"],"additionalProperties":false}}},"required":["targets"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/connectors":{"post":{"operationId":"remoteAccess.connectors.create","summary":"Create a connector and return its one-time enrollment token","description":"Create a connector and return its one-time enrollment token","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":120}},"required":["label"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"},"get":{"operationId":"remoteAccess.connectors.list","summary":"List sanitized connector status for project administration","description":"List sanitized connector status for project administration","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/connectors/{connector_id}":{"get":{"operationId":"remoteAccess.connectors.get","summary":"Get sanitized connector status","description":"Get sanitized connector status","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connector_id","in":"path","required":true,"description":"Path parameter connector_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/connectors/{connector_id}/rotate":{"post":{"operationId":"remoteAccess.connectors.rotate","summary":"Invalidate connector authority and return a one-time key rotation token","description":"Invalidate connector authority and return a one-time key rotation token","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connector_id","in":"path","required":true,"description":"Path parameter connector_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/remote-access/connectors/{connector_id}/revoke":{"post":{"operationId":"remoteAccess.connectors.revoke","summary":"Emergency revoke a connector and all of its target authority","description":"Emergency revoke a connector and all of its target authority","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"connector_id","in":"path","required":true,"description":"Path parameter connector_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/remote-access/targets/{target_id}/verification-requests":{"post":{"operationId":"remoteAccess.targets.requestVerification","summary":"Request a new connector-signed target verification","description":"Request a new connector-signed target verification","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"target_id","in":"path","required":true,"description":"Path parameter target_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/remote-access/targets/{target_id}/authority-bundle/reveal":{"post":{"operationId":"remoteAccess.targets.revealAuthorityBundle","summary":"Reveal the signed verified target authority bundle","description":"Reveal the signed verified target authority bundle","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"target_id","in":"path","required":true,"description":"Path parameter target_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"acknowledge_sensitive_data":{"type":"boolean","enum":[true]}},"required":["acknowledge_sensitive_data"],"additionalProperties":false}}}},"responses":{"200":{"description":"Signed verified target authority bundle","content":{"application/json":{"schema":{"type":"object","properties":{"authority_bundle":{"type":"object","properties":{"authority":{"type":"object","properties":{"activeAuthorityKeyId":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},"activeExecutionGrantKeyId":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},"authorityRootId":{"type":"string","format":"uuid"},"authorityRootKeyDigest":{"type":"string","pattern":"^[a-f0-9]{64}$"},"authorityUpdateKeys":{"type":"object","additionalProperties":{"type":"object","properties":{"publicKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"state":{"type":"string","enum":["active","retired"]}},"required":["publicKey","state"],"additionalProperties":false}},"executionGrantKeys":{"type":"object","additionalProperties":{"type":"object","properties":{"expiresAt":{"type":"string","format":"date-time"},"notBefore":{"type":"string","format":"date-time"},"publicKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"state":{"type":"string","enum":["active","retired"]}},"required":["expiresAt","notBefore","publicKey","state"],"additionalProperties":false}},"authorityVersion":{"type":"integer","minimum":1},"connectorAuthorityEpoch":{"type":"integer","minimum":1},"connectorId":{"type":"string","format":"uuid"},"connectorKeyId":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},"destinationDigest":{"type":"string","pattern":"^[a-f0-9]{64}$"},"issuedAt":{"type":"string","format":"date-time"},"policyDigest":{"type":"string","pattern":"^[a-f0-9]{64}$"},"policyRevisionId":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"runtime":{"type":"object","properties":{"adapterId":{"type":"string","enum":["openssh_runner"]},"adapterProtocolVersion":{"type":"integer","enum":[1]},"catalogDigest":{"type":"string","pattern":"^[a-f0-9]{64}$"},"catalogVersion":{"type":"string"},"runnerVersion":{"type":"string"}},"required":["adapterId","adapterProtocolVersion","catalogDigest","catalogVersion","runnerVersion"],"additionalProperties":false},"targetAuthorityEpoch":{"type":"integer","minimum":1},"targetId":{"type":"string","format":"uuid"},"version":{"type":"integer","enum":[1]}},"required":["activeAuthorityKeyId","activeExecutionGrantKeyId","authorityRootId","authorityRootKeyDigest","authorityUpdateKeys","executionGrantKeys","authorityVersion","connectorAuthorityEpoch","connectorId","connectorKeyId","destinationDigest","issuedAt","policyDigest","policyRevisionId","projectId","runtime","targetAuthorityEpoch","targetId","version"],"additionalProperties":false},"signature":{"type":"string","pattern":"^[A-Za-z0-9_-]{86}$"},"authorityKeyId":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"}},"required":["authority","authorityKeyId","signature"],"additionalProperties":false}},"required":["authority_bundle"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/remote-access/targets/{target_id}/verification-bootstrap/reveal":{"post":{"operationId":"remoteAccess.targets.revealVerificationBootstrap","summary":"Reveal a signed pre-trust target bootstrap for operator installation","description":"Reveal a signed pre-trust target bootstrap for operator installation","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"target_id","in":"path","required":true,"description":"Path parameter target_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"acknowledge_sensitive_data":{"type":"boolean","enum":[true]}},"required":["acknowledge_sensitive_data"],"additionalProperties":false}}}},"responses":{"200":{"description":"Signed pre-trust bootstrap without the independently delivered fingerprint","content":{"application/json":{"schema":{"type":"object","properties":{"verification_bootstrap":{"type":"object","properties":{"bootstrap":{"type":"object","properties":{"activeAuthorityKeyId":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},"activeExecutionGrantKeyId":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},"authorityRootId":{"type":"string","format":"uuid"},"authorityRootKeyDigest":{"type":"string","pattern":"^[a-f0-9]{64}$"},"authorityUpdateKeys":{"type":"object","additionalProperties":{"type":"object","properties":{"publicKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"state":{"type":"string","enum":["active","retired"]}},"required":["publicKey","state"],"additionalProperties":false}},"executionGrantKeys":{"type":"object","additionalProperties":{"type":"object","properties":{"expiresAt":{"type":"string","format":"date-time"},"notBefore":{"type":"string","format":"date-time"},"publicKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"state":{"type":"string","enum":["active","retired"]}},"required":["expiresAt","notBefore","publicKey","state"],"additionalProperties":false}},"authProfileId":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$"},"connectorAuthorityEpoch":{"type":"integer","minimum":1},"connectorId":{"type":"string","format":"uuid"},"connectorKeyId":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"},"expectedRuntime":{"type":"object","properties":{"adapterId":{"type":"string","enum":["openssh_runner"]},"adapterProtocolVersion":{"type":"integer","enum":[1]},"catalogDigest":{"type":"string","pattern":"^[a-f0-9]{64}$"},"catalogVersion":{"type":"string"},"runnerVersion":{"type":"string"}},"required":["adapterId","adapterProtocolVersion","catalogDigest","catalogVersion","runnerVersion"],"additionalProperties":false},"expiresAt":{"type":"string","format":"date-time"},"issuedAt":{"type":"string","format":"date-time"},"nonce":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"projectId":{"type":"string","format":"uuid"},"targetId":{"type":"string","format":"uuid"},"version":{"type":"integer","enum":[1]}},"required":["activeAuthorityKeyId","activeExecutionGrantKeyId","authorityRootId","authorityRootKeyDigest","authorityUpdateKeys","executionGrantKeys","authProfileId","connectorAuthorityEpoch","connectorId","connectorKeyId","expectedRuntime","expiresAt","issuedAt","nonce","projectId","targetId","version"],"additionalProperties":false},"signature":{"type":"string","pattern":"^[A-Za-z0-9_-]{86}$"},"authorityKeyId":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,64}$"}},"required":["authorityKeyId","bootstrap","signature"],"additionalProperties":false}},"required":["verification_bootstrap"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/remote-access/targets/{target_id}/disable":{"post":{"operationId":"remoteAccess.targets.disable","summary":"Disable a remote access target and revoke its authority","description":"Disable a remote access target and revoke its authority","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"target_id","in":"path","required":true,"description":"Path parameter target_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/remote-access/targets/{target_id}/policy":{"get":{"operationId":"remoteAccess.policies.get","summary":"Get the current target policy","description":"Get the current target policy","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"target_id","in":"path","required":true,"description":"Path parameter target_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"put":{"operationId":"remoteAccess.policies.update","summary":"Create a new immutable target policy revision","description":"Create a new immutable target policy revision","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"target_id","in":"path","required":true,"description":"Path parameter target_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"allowed_operations":{"type":"array","items":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]}},"max_output_bytes":{"type":"integer","minimum":1,"maximum":10485760},"max_timeout_seconds":{"type":"integer","minimum":1,"maximum":300}},"required":["allowed_operations","max_output_bytes","max_timeout_seconds"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/remote-access/policies/validate":{"post":{"operationId":"remoteAccess.policies.validate","summary":"Validate and canonicalize a policy without changing it","description":"Validate and canonicalize a policy without changing it","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"allowed_operations":{"type":"array","items":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]}},"max_output_bytes":{"type":"integer","minimum":1,"maximum":10485760},"max_timeout_seconds":{"type":"integer","minimum":1,"maximum":300}},"required":["allowed_operations","max_output_bytes","max_timeout_seconds"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/approvals":{"get":{"operationId":"remoteAccess.approvals.list","summary":"List pending approval requests","description":"List pending approval requests","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Pending approvals","content":{"application/json":{"schema":{"type":"object","properties":{"approvals":{"type":"array","items":{"type":"object","properties":{"blast_radius":{"type":"string","enum":["single_host","single_service_process"]},"request":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"target_id":{"type":"string","format":"uuid"},"operation_id":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]},"status":{"type":"string","enum":["approved","cancelled","denied","expired","pending"]},"timeout_seconds":{"type":"integer"},"max_output_bytes":{"type":"integer"},"expires_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","target_id","operation_id","status","timeout_seconds","max_output_bytes","expires_at","created_at","updated_at"],"additionalProperties":false},"mode":{"type":"string","enum":["observe","remediate"]},"decision_code":{"type":"string"},"safe_operation_display":{"type":"string"},"policy_revision":{"type":["integer","null"]},"requester_display":{"type":"string"},"safe_operation":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","enum":["host.disk_usage"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.kernel"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.load"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.time"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["service.restart"]},"parameters":{"type":"object","properties":{"unit":{"type":"string","minLength":1,"maxLength":128}},"required":["unit"],"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["service.status"]},"parameters":{"type":"object","properties":{"unit":{"type":"string","minLength":1,"maxLength":128}},"required":["unit"],"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false}]},"target_display":{"type":"object","properties":{"environment":{"type":"string"},"label":{"type":"string"}},"required":["environment","label"],"additionalProperties":false},"can_approve":{"type":"boolean"},"fresh_auth_required":{"type":"boolean"}},"required":["blast_radius","request","mode","decision_code","safe_operation_display","policy_revision","requester_display","safe_operation","target_display","can_approve","fresh_auth_required"],"additionalProperties":false}}},"required":["approvals"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/approvals/{request_id}":{"get":{"operationId":"remoteAccess.approvals.get","summary":"Get one sanitized approval request","description":"Get one sanitized approval request","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"request_id","in":"path","required":true,"description":"Path parameter request_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Pending approval","content":{"application/json":{"schema":{"type":"object","properties":{"blast_radius":{"type":"string","enum":["single_host","single_service_process"]},"request":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"target_id":{"type":"string","format":"uuid"},"operation_id":{"type":"string","enum":["host.disk_usage","host.kernel","host.load","host.time","service.restart","service.status"]},"status":{"type":"string","enum":["approved","cancelled","denied","expired","pending"]},"timeout_seconds":{"type":"integer"},"max_output_bytes":{"type":"integer"},"expires_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","target_id","operation_id","status","timeout_seconds","max_output_bytes","expires_at","created_at","updated_at"],"additionalProperties":false},"mode":{"type":"string","enum":["observe","remediate"]},"decision_code":{"type":"string"},"safe_operation_display":{"type":"string"},"policy_revision":{"type":["integer","null"]},"requester_display":{"type":"string"},"safe_operation":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","enum":["host.disk_usage"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.kernel"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.load"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["host.time"]},"parameters":{"type":"object","properties":{},"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["service.restart"]},"parameters":{"type":"object","properties":{"unit":{"type":"string","minLength":1,"maxLength":128}},"required":["unit"],"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","enum":["service.status"]},"parameters":{"type":"object","properties":{"unit":{"type":"string","minLength":1,"maxLength":128}},"required":["unit"],"additionalProperties":false}},"required":["id","parameters"],"additionalProperties":false}]},"target_display":{"type":"object","properties":{"environment":{"type":"string"},"label":{"type":"string"}},"required":["environment","label"],"additionalProperties":false},"can_approve":{"type":"boolean"},"fresh_auth_required":{"type":"boolean"}},"required":["blast_radius","request","mode","decision_code","safe_operation_display","policy_revision","requester_display","safe_operation","target_display","can_approve","fresh_auth_required"],"additionalProperties":false}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/executions/{execution_id}":{"get":{"operationId":"remoteAccess.executions.get","summary":"Get sanitized execution status and result metadata","description":"Get sanitized execution status and result metadata","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"execution_id","in":"path","required":true,"description":"Path parameter execution_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/remote-access/audit":{"get":{"operationId":"remoteAccess.audit.list","summary":"List immutable metadata-only remote access audit events","description":"List immutable metadata-only remote access audit events","tags":["remoteAccess"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"Query parameter cursor","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/resource-history/events":{"get":{"operationId":"resourceHistory.listEvents","summary":"List resource audit events. Agents should pass resource_id for page-scoped history.","description":"List resource audit events. Agents should pass resource_id for page-scoped history.","tags":["resourceHistory"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"resource_type","in":"query","required":true,"description":"Resource type whose audit events should be listed.","schema":{"enum":["automation","dashboard","monitor","status_page"],"type":"string"}},{"name":"resource_id","in":"query","required":false,"description":"Optional resource id filter. Pair with resource_type for page-scoped history.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum rows to return. Defaults to 50, max 100.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Audit events","content":{"application/json":{"schema":{"additionalProperties":true,"description":"List response with a data array.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/resource-history/revisions":{"get":{"operationId":"resourceHistory.listRevisions","summary":"List restorable resource revisions for dashboards, automations, monitors, and status pages.","description":"List restorable resource revisions for dashboards, automations, monitors, and status pages.","tags":["resourceHistory"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"resource_type","in":"query","required":true,"description":"Resource type whose revisions should be listed.","schema":{"enum":["automation","dashboard","monitor","status_page"],"type":"string"}},{"name":"resource_id","in":"query","required":true,"description":"Resource id whose revisions should be listed.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum rows to return. Defaults to 50, max 100.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Resource revisions","content":{"application/json":{"schema":{"additionalProperties":true,"description":"List response with a data array.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/resource-history/revisions/{revision_id}/rollback":{"post":{"operationId":"resourceHistory.rollbackRevision","summary":"Restore the selected historical revision and record the rollback as a new revision.","description":"Restore the selected historical revision and record the rollback as a new revision.","tags":["resourceHistory"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"revision_id","in":"path","required":true,"description":"Path parameter revision_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Rollback result","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Rollback/reapply response with the new revision id and number.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/resource-history/revisions/{revision_id}/reapply":{"post":{"operationId":"resourceHistory.reapplyRevision","summary":"Reapply the selected historical revision and record the action as a new revision.","description":"Reapply the selected historical revision and record the action as a new revision.","tags":["resourceHistory"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"revision_id","in":"path","required":true,"description":"Path parameter revision_id","schema":{"type":"string"}}],"responses":{"200":{"description":"Reapply result","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Rollback/reapply response with the new revision id and number.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"dangerous"}},"/v1/projects/{project_id}/schema":{"get":{"operationId":"schema.get","summary":"Return the public column map for the safe observability query model.","description":"Return the public column map for the safe observability query model.","tags":["schema"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/status-pages":{"get":{"operationId":"statusPages.list","summary":"List status pages with their components and component counts","description":"List status pages with their components and component counts","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"statusPages.create","summary":"Create a status page. Body: { name, slug, isPublic?, customDomain?, themeConfig? }","description":"Create a status page. Body: { name, slug, isPublic?, customDomain?, themeConfig? }","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/status-pages/{status_page_id}":{"get":{"operationId":"statusPages.get","summary":"Get one status page with its components","description":"Get one status page with its components","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"patch":{"operationId":"statusPages.update","summary":"Update a status page. Body: { name?, slug?, isPublic?, customDomain?, themeConfig? }","description":"Update a status page. Body: { name?, slug?, isPublic?, customDomain?, themeConfig? }","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"statusPages.delete","summary":"Delete a status page (cascades to its components and subscribers)","description":"Delete a status page (cascades to its components and subscribers)","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/status-pages/{status_page_id}/components":{"get":{"operationId":"statusPages.listComponents","summary":"List components on a status page","description":"List components on a status page","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"post":{"operationId":"statusPages.createComponent","summary":"Create a status component. Body: { name, description?, type?, monitorId?, externalStatusUrl?, parentComponentId? }. Health rolls up from monitorId for monitor components; static components may carry an externalStatusUrl; group components can contain child components.","description":"Create a status component. Body: { name, description?, type?, monitorId?, externalStatusUrl?, parentComponentId? }. Health rolls up from monitorId for monitor components; static components may carry an externalStatusUrl; group components can contain child components.","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"description":{"type":["string","null"]},"externalStatusUrl":{"description":"Optional HTTP(S) third-party status URL for static components.","format":"uri","type":["string","null"]},"monitorId":{"description":"Optional direct backing monitor id.","type":["string","null"]},"name":{"type":"string"},"parentComponentId":{"description":"Optional parent group component id. Use null to clear.","type":["string","null"]},"type":{"description":"Component backing mode. Group components cannot include monitorId or externalStatusUrl.","enum":["monitor","static","group"],"type":"string"}},"required":["name"],"type":"object"}}}},"responses":{"201":{"description":"Created status component","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Status component row, including monitor/static backing metadata.","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/status-pages/{status_page_id}/components/{component_id}":{"patch":{"operationId":"statusPages.updateComponent","summary":"Update a status component. Body: { name?, description?, type?, monitorId?, externalStatusUrl?, parentComponentId? }. Pass type:'static' or monitorId:null to clear the direct monitor link; pass parentComponentId:null to move a component out of a group.","description":"Update a status component. Body: { name?, description?, type?, monitorId?, externalStatusUrl?, parentComponentId? }. Pass type:'static' or monitorId:null to clear the direct monitor link; pass parentComponentId:null to move a component out of a group.","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}},{"name":"component_id","in":"path","required":true,"description":"Path parameter component_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"description":{"type":["string","null"]},"externalStatusUrl":{"description":"Optional HTTP(S) third-party status URL for static components.","format":"uri","type":["string","null"]},"monitorId":{"description":"Optional direct backing monitor id.","type":["string","null"]},"name":{"type":"string"},"parentComponentId":{"description":"Optional parent group component id. Use null to clear.","type":["string","null"]},"type":{"description":"Component backing mode. Group components cannot include monitorId or externalStatusUrl.","enum":["monitor","static","group"],"type":"string"}},"required":[],"type":"object"}}}},"responses":{"200":{"description":"Updated status component"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"},"delete":{"operationId":"statusPages.deleteComponent","summary":"Delete a status component (does not delete linked monitors)","description":"Delete a status component (does not delete linked monitors)","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}},{"name":"component_id","in":"path","required":true,"description":"Path parameter component_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/status-pages/{status_page_id}/components/{component_id}/link-monitor":{"post":{"operationId":"statusPages.linkMonitor","summary":"Link a monitor to a status component so its health rolls up. Body: { monitorId } or { monitorName }. Updates the component's direct monitor link.","description":"Link a monitor to a status component so its health rolls up. Body: { monitorId } or { monitorName }. Updates the component's direct monitor link.","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}},{"name":"component_id","in":"path","required":true,"description":"Path parameter component_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"monitorId":{"type":"string"},"monitorName":{"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"Linked monitor","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Monitor link result with linkedMonitorId reflecting the component's direct link.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"write"}},"/v1/projects/{project_id}/status-pages/{status_page_id}/components/{component_id}/unlink-monitor":{"post":{"operationId":"statusPages.unlinkMonitor","summary":"Unlink a monitor from a status component. Body: { monitorId } or { monitorName }. Clears the component's direct monitor link.","description":"Unlink a monitor from a status component. Body: { monitorId } or { monitorName }. Clears the component's direct monitor link.","tags":["statusPages"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}},{"name":"component_id","in":"path","required":true,"description":"Path parameter component_id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"monitorId":{"type":"string"},"monitorName":{"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"Unlinked monitor","content":{"application/json":{"schema":{"additionalProperties":true,"description":"Monitor link result with linkedMonitorId reflecting the component's direct link.","type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/status-pages/{status_page_id}/subscribers":{"get":{"operationId":"subscribers.list","summary":"List status page subscribers with channel and scoped components","description":"List status page subscribers with channel and scoped components","tags":["subscribers"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/status-pages/{status_page_id}/subscribers/{subscriber_id}":{"get":{"operationId":"subscribers.get","summary":"Get one status page subscriber with channel and scoped components","description":"Get one status page subscriber with channel and scoped components","tags":["subscribers"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}},{"name":"subscriber_id","in":"path","required":true,"description":"Path parameter subscriber_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"},"delete":{"operationId":"subscribers.delete","summary":"Delete a status page subscriber for operator-driven cleanup","description":"Delete a status page subscriber for operator-driven cleanup","tags":["subscribers"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"status_page_id","in":"path","required":true,"description":"Path parameter status_page_id","schema":{"type":"string"}},{"name":"subscriber_id","in":"path","required":true,"description":"Path parameter subscriber_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":true,"x-risk":"destructive"}},"/v1/projects/{project_id}/traces":{"get":{"operationId":"traces.list","summary":"List traces for a project with filtering and pagination","description":"List traces for a project with filtering and pagination","tags":["traces"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start of the time range","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the time range","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Deployment environment","schema":{"type":"string"}},{"name":"namespace","in":"query","required":false,"description":"Kubernetes namespace","schema":{"type":"string"}},{"name":"service_name","in":"query","required":false,"description":"Service name","schema":{"type":"string"}},{"name":"root_span","in":"query","required":false,"description":"Exact root span name","schema":{"type":"string"}},{"name":"http_method","in":"query","required":false,"description":"HTTP request method","schema":{"type":"string"}},{"name":"http_status_code","in":"query","required":false,"description":"Three-digit HTTP response status code","schema":{"type":"string"}},{"name":"min_duration","in":"query","required":false,"description":"Minimum trace duration in milliseconds","schema":{"type":"number"}},{"name":"max_duration","in":"query","required":false,"description":"Maximum trace duration in milliseconds","schema":{"type":"number"}},{"name":"status","in":"query","required":false,"description":"Trace status","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Trace ID, root span, or service search","schema":{"type":"string"}},{"name":"operation","in":"query","required":false,"description":"Normalized operation name","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum rows to return","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/trace-operations":{"get":{"operationId":"traces.listOperations","summary":"List trace operations grouped by service and normalized root span name, with sparkline + p50/p95","description":"List trace operations grouped by service and normalized root span name, with sparkline + p50/p95","tags":["traces"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/trace-latency":{"get":{"operationId":"traces.latency","summary":"Request latency over one window: p50, p95, and p99 of incoming (server and consumer) span duration, optionally filtered by service, span name or HTTP route, and environment. Query monitors with source `traces` read the same measurement.","description":"Request latency over one window: p50, p95, and p99 of incoming (server and consumer) span duration, optionally filtered by service, span name or HTTP route, and environment. Query monitors with source `traces` read the same measurement.","tags":["traces"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start of the window","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the window (exclusive)","schema":{"type":"string"}},{"name":"service_name","in":"query","required":false,"description":"Service name","schema":{"type":"string"}},{"name":"operation","in":"query","required":false,"description":"Span name or HTTP route","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Deployment environment","schema":{"type":"string"}}],"responses":{"200":{"description":"Percentiles in milliseconds; null when no span matched.","content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"environment":{"type":["string","null"]},"from":{"format":"date-time","type":"string"},"operation":{"type":["string","null"]},"p50_ms":{"type":["number","null"]},"p95_ms":{"type":["number","null"]},"p99_ms":{"type":["number","null"]},"service_name":{"type":["string","null"]},"span_count":{"type":"integer"},"to":{"format":"date-time","type":"string"}},"required":["environment","from","operation","p50_ms","p95_ms","p99_ms","service_name","span_count","to"],"type":"object"}}}},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/traces/{trace_id}":{"get":{"operationId":"traces.get","summary":"Get a single trace with all spans","description":"Get a single trace with all spans","tags":["traces"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"trace_id","in":"path","required":true,"description":"Path parameter trace_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start time (ISO 8601)","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End time (ISO 8601)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/traces/{trace_id}/errors":{"get":{"operationId":"traces.listRelatedErrors","summary":"List error groups correlated to a trace","description":"List error groups correlated to a trace","tags":["traces"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"trace_id","in":"path","required":true,"description":"Path parameter trace_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/traces/{trace_id}/logs":{"get":{"operationId":"traces.listRelatedLogs","summary":"List logs correlated to a trace id","description":"List logs correlated to a trace id","tags":["traces"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"trace_id","in":"path","required":true,"description":"Path parameter trace_id","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum rows to return","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/services":{"get":{"operationId":"traces.serviceMap","summary":"Get the aggregated service-to-service call graph for a project","description":"Get the aggregated service-to-service call graph for a project","tags":["traces"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/telemetry-quality":{"get":{"operationId":"telemetryQuality.get","summary":"Audit bounded, content-free service telemetry completeness, correlation, duplication, attribute types, and cardinality","description":"Audit bounded, content-free service telemetry completeness, correlation, duplication, attribute types, and cardinality","tags":["telemetryQuality"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Query parameter from","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Query parameter to","schema":{"type":"string","format":"date-time"}},{"name":"service_name","in":"query","required":false,"description":"Query parameter service_name","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"release","in":"query","required":false,"description":"Query parameter release","schema":{"type":"string"}},{"name":"include_examples","in":"query","required":false,"description":"Query parameter include_examples","schema":{"type":"boolean"}},{"name":"attribute_sample_limit","in":"query","required":false,"description":"Maximum recent log and span rows used for attribute analysis","schema":{"maximum":50000,"minimum":100,"type":"integer"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/vitals":{"get":{"operationId":"vitals.summary","summary":"Get aggregate Web Vitals summary (p50/p75/p90/p95/p99, rating distribution)","description":"Get aggregate Web Vitals summary (p50/p75/p90/p95/p99, rating distribution)","tags":["vitals"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"metric","in":"query","required":false,"description":"Query parameter metric","schema":{"type":"string"}},{"name":"period","in":"query","required":false,"description":"Query parameter period","schema":{"type":"string"}},{"name":"url","in":"query","required":false,"description":"Query parameter url","schema":{"type":"string"}},{"name":"browser","in":"query","required":false,"description":"Query parameter browser","schema":{"type":"string"}},{"name":"call_type","in":"query","required":false,"description":"Query parameter call_type","schema":{"type":"string"}},{"name":"city","in":"query","required":false,"description":"Query parameter city","schema":{"type":"string"}},{"name":"connection","in":"query","required":false,"description":"Query parameter connection","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Query parameter country","schema":{"type":"string"}},{"name":"device_type","in":"query","required":false,"description":"Query parameter device_type","schema":{"type":"string"}},{"name":"error_name","in":"query","required":false,"description":"Query parameter error_name","schema":{"type":"string"}},{"name":"finish_reason","in":"query","required":false,"description":"Query parameter finish_reason","schema":{"type":"string"}},{"name":"http_status","in":"query","required":false,"description":"Query parameter http_status","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Query parameter language","schema":{"type":"string"}},{"name":"model","in":"query","required":false,"description":"Query parameter model","schema":{"type":"string"}},{"name":"os","in":"query","required":false,"description":"Query parameter os","schema":{"type":"string"}},{"name":"page_path","in":"query","required":false,"description":"Query parameter page_path","schema":{"type":"string"}},{"name":"provider","in":"query","required":false,"description":"Query parameter provider","schema":{"type":"string"}},{"name":"query_string","in":"query","required":false,"description":"Query parameter query_string","schema":{"type":"string"}},{"name":"referrer","in":"query","required":false,"description":"Query parameter referrer","schema":{"type":"string"}},{"name":"region","in":"query","required":false,"description":"Query parameter region","schema":{"type":"string"}},{"name":"route","in":"query","required":false,"description":"Query parameter route","schema":{"type":"string"}},{"name":"timezone","in":"query","required":false,"description":"Query parameter timezone","schema":{"type":"string"}},{"name":"trace_id","in":"query","required":false,"description":"Query parameter trace_id","schema":{"type":"string"}},{"name":"user_id","in":"query","required":false,"description":"Query parameter user_id","schema":{"type":"string"}},{"name":"utm_campaign","in":"query","required":false,"description":"Query parameter utm_campaign","schema":{"type":"string"}},{"name":"utm_medium","in":"query","required":false,"description":"Query parameter utm_medium","schema":{"type":"string"}},{"name":"utm_source","in":"query","required":false,"description":"Query parameter utm_source","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/vitals/timeline":{"get":{"operationId":"vitals.timeline","summary":"Get time-series Web Vitals data for charting","description":"Get time-series Web Vitals data for charting","tags":["vitals"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"granularity","in":"query","required":false,"description":"Query parameter granularity","schema":{"enum":["1h","6h","1d"],"type":"string"}},{"name":"metric","in":"query","required":true,"description":"Query parameter metric","schema":{"type":"string"}},{"name":"percentile","in":"query","required":false,"description":"Query parameter percentile","schema":{"enum":["p50","p75","p90","p95","p99"],"type":"string"}},{"name":"period","in":"query","required":false,"description":"Query parameter period","schema":{"type":"string"}},{"name":"browser","in":"query","required":false,"description":"Query parameter browser","schema":{"type":"string"}},{"name":"call_type","in":"query","required":false,"description":"Query parameter call_type","schema":{"type":"string"}},{"name":"city","in":"query","required":false,"description":"Query parameter city","schema":{"type":"string"}},{"name":"connection","in":"query","required":false,"description":"Query parameter connection","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Query parameter country","schema":{"type":"string"}},{"name":"device_type","in":"query","required":false,"description":"Query parameter device_type","schema":{"type":"string"}},{"name":"error_name","in":"query","required":false,"description":"Query parameter error_name","schema":{"type":"string"}},{"name":"finish_reason","in":"query","required":false,"description":"Query parameter finish_reason","schema":{"type":"string"}},{"name":"http_status","in":"query","required":false,"description":"Query parameter http_status","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Query parameter language","schema":{"type":"string"}},{"name":"model","in":"query","required":false,"description":"Query parameter model","schema":{"type":"string"}},{"name":"os","in":"query","required":false,"description":"Query parameter os","schema":{"type":"string"}},{"name":"page_path","in":"query","required":false,"description":"Query parameter page_path","schema":{"type":"string"}},{"name":"provider","in":"query","required":false,"description":"Query parameter provider","schema":{"type":"string"}},{"name":"query_string","in":"query","required":false,"description":"Query parameter query_string","schema":{"type":"string"}},{"name":"referrer","in":"query","required":false,"description":"Query parameter referrer","schema":{"type":"string"}},{"name":"region","in":"query","required":false,"description":"Query parameter region","schema":{"type":"string"}},{"name":"route","in":"query","required":false,"description":"Query parameter route","schema":{"type":"string"}},{"name":"timezone","in":"query","required":false,"description":"Query parameter timezone","schema":{"type":"string"}},{"name":"trace_id","in":"query","required":false,"description":"Query parameter trace_id","schema":{"type":"string"}},{"name":"user_id","in":"query","required":false,"description":"Query parameter user_id","schema":{"type":"string"}},{"name":"utm_campaign","in":"query","required":false,"description":"Query parameter utm_campaign","schema":{"type":"string"}},{"name":"utm_medium","in":"query","required":false,"description":"Query parameter utm_medium","schema":{"type":"string"}},{"name":"utm_source","in":"query","required":false,"description":"Query parameter utm_source","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/vitals/urls":{"get":{"operationId":"vitals.urls","summary":"Get per-URL Web Vitals breakdown (slowest pages)","description":"Get per-URL Web Vitals breakdown (slowest pages)","tags":["vitals"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"type":"integer"}},{"name":"metric","in":"query","required":true,"description":"Query parameter metric","schema":{"type":"string"}},{"name":"period","in":"query","required":false,"description":"Query parameter period","schema":{"type":"string"}},{"name":"rating","in":"query","required":false,"description":"Query parameter rating","schema":{"type":"string"}},{"name":"browser","in":"query","required":false,"description":"Query parameter browser","schema":{"type":"string"}},{"name":"call_type","in":"query","required":false,"description":"Query parameter call_type","schema":{"type":"string"}},{"name":"city","in":"query","required":false,"description":"Query parameter city","schema":{"type":"string"}},{"name":"connection","in":"query","required":false,"description":"Query parameter connection","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Query parameter country","schema":{"type":"string"}},{"name":"device_type","in":"query","required":false,"description":"Query parameter device_type","schema":{"type":"string"}},{"name":"error_name","in":"query","required":false,"description":"Query parameter error_name","schema":{"type":"string"}},{"name":"finish_reason","in":"query","required":false,"description":"Query parameter finish_reason","schema":{"type":"string"}},{"name":"http_status","in":"query","required":false,"description":"Query parameter http_status","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Query parameter language","schema":{"type":"string"}},{"name":"model","in":"query","required":false,"description":"Query parameter model","schema":{"type":"string"}},{"name":"os","in":"query","required":false,"description":"Query parameter os","schema":{"type":"string"}},{"name":"page_path","in":"query","required":false,"description":"Query parameter page_path","schema":{"type":"string"}},{"name":"provider","in":"query","required":false,"description":"Query parameter provider","schema":{"type":"string"}},{"name":"query_string","in":"query","required":false,"description":"Query parameter query_string","schema":{"type":"string"}},{"name":"referrer","in":"query","required":false,"description":"Query parameter referrer","schema":{"type":"string"}},{"name":"region","in":"query","required":false,"description":"Query parameter region","schema":{"type":"string"}},{"name":"route","in":"query","required":false,"description":"Query parameter route","schema":{"type":"string"}},{"name":"timezone","in":"query","required":false,"description":"Query parameter timezone","schema":{"type":"string"}},{"name":"trace_id","in":"query","required":false,"description":"Query parameter trace_id","schema":{"type":"string"}},{"name":"user_id","in":"query","required":false,"description":"Query parameter user_id","schema":{"type":"string"}},{"name":"utm_campaign","in":"query","required":false,"description":"Query parameter utm_campaign","schema":{"type":"string"}},{"name":"utm_medium","in":"query","required":false,"description":"Query parameter utm_medium","schema":{"type":"string"}},{"name":"utm_source","in":"query","required":false,"description":"Query parameter utm_source","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}},"/v1/projects/{project_id}/vitals/breakdown":{"get":{"operationId":"vitals.breakdown","summary":"Get dimensional Web Vitals breakdowns for pages, geography, devices, and tags","description":"Get dimensional Web Vitals breakdowns for pages, geography, devices, and tags","tags":["vitals"],"parameters":[{"name":"project_id","in":"path","required":true,"description":"Path parameter project_id","schema":{"type":"string"}},{"name":"dimension","in":"query","required":false,"description":"Query parameter dimension","schema":{"enum":["page_path","query_string","referrer","country","region","city","timezone","language","device_type","browser","os","utm_source","utm_medium","utm_campaign","provider","model","call_type","finish_reason","error_name","http_status","user_id","trace_id","route","connection"],"type":"string"}},{"name":"environment","in":"query","required":false,"description":"Query parameter environment","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Query parameter limit","schema":{"type":"integer"}},{"name":"metric","in":"query","required":true,"description":"Query parameter metric","schema":{"type":"string"}},{"name":"percentile","in":"query","required":false,"description":"Query parameter percentile","schema":{"enum":["p50","p75","p90","p95","p99"],"type":"string"}},{"name":"period","in":"query","required":false,"description":"Query parameter period","schema":{"type":"string"}},{"name":"rating","in":"query","required":false,"description":"Query parameter rating","schema":{"type":"string"}},{"name":"browser","in":"query","required":false,"description":"Query parameter browser","schema":{"type":"string"}},{"name":"call_type","in":"query","required":false,"description":"Query parameter call_type","schema":{"type":"string"}},{"name":"city","in":"query","required":false,"description":"Query parameter city","schema":{"type":"string"}},{"name":"connection","in":"query","required":false,"description":"Query parameter connection","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Query parameter country","schema":{"type":"string"}},{"name":"device_type","in":"query","required":false,"description":"Query parameter device_type","schema":{"type":"string"}},{"name":"error_name","in":"query","required":false,"description":"Query parameter error_name","schema":{"type":"string"}},{"name":"finish_reason","in":"query","required":false,"description":"Query parameter finish_reason","schema":{"type":"string"}},{"name":"http_status","in":"query","required":false,"description":"Query parameter http_status","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Query parameter language","schema":{"type":"string"}},{"name":"model","in":"query","required":false,"description":"Query parameter model","schema":{"type":"string"}},{"name":"os","in":"query","required":false,"description":"Query parameter os","schema":{"type":"string"}},{"name":"page_path","in":"query","required":false,"description":"Query parameter page_path","schema":{"type":"string"}},{"name":"provider","in":"query","required":false,"description":"Query parameter provider","schema":{"type":"string"}},{"name":"query_string","in":"query","required":false,"description":"Query parameter query_string","schema":{"type":"string"}},{"name":"referrer","in":"query","required":false,"description":"Query parameter referrer","schema":{"type":"string"}},{"name":"region","in":"query","required":false,"description":"Query parameter region","schema":{"type":"string"}},{"name":"route","in":"query","required":false,"description":"Query parameter route","schema":{"type":"string"}},{"name":"timezone","in":"query","required":false,"description":"Query parameter timezone","schema":{"type":"string"}},{"name":"trace_id","in":"query","required":false,"description":"Query parameter trace_id","schema":{"type":"string"}},{"name":"user_id","in":"query","required":false,"description":"Query parameter user_id","schema":{"type":"string"}},{"name":"utm_campaign","in":"query","required":false,"description":"Query parameter utm_campaign","schema":{"type":"string"}},{"name":"utm_medium","in":"query","required":false,"description":"Query parameter utm_medium","schema":{"type":"string"}},{"name":"utm_source","in":"query","required":false,"description":"Query parameter utm_source","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"default":{"description":"Authentication, authorization, validation, rate-limit, or server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"x-project-scoped":true,"x-sensitive":false,"x-risk":"read"}}},"components":{"schemas":{"ApiError":{"description":"A canonical error envelope or a documented legacy error response.","oneOf":[{"type":"object","description":"Canonical machine-readable Squasher API error response.","properties":{"type":{"type":"string","description":"Stable error category.","enum":["invalid_request","authentication_error","permission_error","not_found","conflict","rate_limited","internal_error","upstream_error","validation_error"]},"code":{"type":"string","description":"Stable machine-readable error code."},"message":{"type":"string","description":"Safe human-readable context."},"param":{"type":"string","description":"Request field or resource related to the error."},"doc_url":{"type":"string","format":"uri","description":"Error documentation link."},"retry_after":{"type":"number","minimum":0,"description":"Advisory retry delay in seconds."}},"required":["type","code","message"],"additionalProperties":false},{"type":"object","description":"Legacy error response retained by specialized endpoints during migration.","properties":{"error":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}},"required":["error"],"additionalProperties":true}]}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-squasher-key","description":"Project-scoped Squasher API key."},"BearerAuth":{"type":"http","scheme":"bearer","description":"Squasher API key passed through the Authorization header."},"OAuth2":{"type":"oauth2","description":"Interactive Squasher user authorization for MCP and CLI sessions.","flows":{"authorizationCode":{"authorizationUrl":"https://mcp.squasher.ai/authorize","tokenUrl":"https://mcp.squasher.ai/token","scopes":{"mcp":"Access mcp when granted by the workspace role.","read":"Access read when granted by the workspace role.","write":"Access write when granted by the workspace role.","events:ingest":"Access events:ingest when granted by the workspace role.","ai:export":"Access ai:export when granted by the workspace role.","errors:read":"Access errors:read when granted by the workspace role.","errors:write":"Access errors:write when granted by the workspace role.","errors:triage":"Access errors:triage when granted by the workspace role.","sourcemaps:read":"Access sourcemaps:read when granted by the workspace role.","sourcemaps:write":"Access sourcemaps:write when granted by the workspace role.","deployments:read":"Access deployments:read when granted by the workspace role.","deployments:write":"Access deployments:write when granted by the workspace role.","notifications:read":"Access notifications:read when granted by the workspace role.","notifications:write":"Access notifications:write when granted by the workspace role.","fixes:read":"Access fixes:read when granted by the workspace role.","fixes:write":"Access fixes:write when granted by the workspace role.","monitors:read":"Access monitors:read when granted by the workspace role.","monitors:write":"Access monitors:write when granted by the workspace role.","incidents:read":"Access incidents:read when granted by the workspace role.","incidents:write":"Access incidents:write when granted by the workspace role.","incidents:triage":"Access incidents:triage when granted by the workspace role.","status_pages:read":"Access status_pages:read when granted by the workspace role.","status_pages:write":"Access status_pages:write when granted by the workspace role.","project:read":"Access project:read when granted by the workspace role.","project:write":"Access project:write when granted by the workspace role.","automations:read":"Access automations:read when granted by the workspace role.","automations:write":"Access automations:write when granted by the workspace role.","automations:approve":"Access automations:approve when granted by the workspace role.","remote_access:read":"Access remote_access:read when granted by the workspace role.","remote_access:request":"Access remote_access:request when granted by the workspace role.","remote_access:manage":"Access remote_access:manage when granted by the workspace role.","remote_access:approve":"Access remote_access:approve when granted by the workspace role.","remote_access:transcript":"Access remote_access:transcript when granted by the workspace role.","on_call:read":"Access on_call:read when granted by the workspace role.","on_call:write":"Access on_call:write when granted by the workspace role.","findings:read":"Access findings:read when granted by the workspace role.","findings:write":"Access findings:write when granted by the workspace role.","investigations:read":"Access investigations:read when granted by the workspace role.","investigations:write":"Access investigations:write when granted by the workspace role.","releases:read":"Access releases:read when granted by the workspace role.","services:read":"Access services:read when granted by the workspace role.","analytics:read":"Access analytics:read when granted by the workspace role.","analytics:write":"Access analytics:write when granted by the workspace role.","providers:read":"Access providers:read when granted by the workspace role.","providers:write":"Access providers:write when granted by the workspace role.","actions:approve":"Access actions:approve when granted by the workspace role.","revenue:read":"Access revenue:read when granted by the workspace role.","revenue:write":"Access revenue:write when granted by the workspace role."}}}}}}}