{"openapi":"3.1.0","info":{"title":"NexGuard AI API","description":"AI-optional security intelligence platform API","version":"0.1.0"},"paths":{"/api/v1/public/identity":{"get":{"tags":["public-api"],"summary":"What this API key is and what it may read","description":"The one route that needs no scope, because it describes the key itself.\n\nIt reveals nothing a holder of the key does not already have: its own tenant,\nits own scopes, its own expiry. Being able to check a credential before a\ndeployment window is worth more than the nothing this conceals.","operationId":"get_public_api_identity_v1","responses":{"200":{"description":"Successful Response","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyIdentity"}}}},"401":{"description":"A valid X-API-Key header is required","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"WWW-Authenticate":{"description":"API key authentication challenge","schema":{"type":"string","enum":["X-API-Key"]}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}},"403":{"description":"The API key does not carry the scope this route requires","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}},"404":{"description":"The record is unavailable to this key","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}},"422":{"description":"The request failed validation","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}},"429":{"description":"The API key exceeded its rate limit","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"Retry-After":{"description":"Seconds until the current window resets","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/public/incidents":{"get":{"tags":["public-api"],"summary":"Incidents belonging to this key's tenant","description":"Most recently active first.\n\nThe tenant filter comes from the key and is part of every statement rather\nthan a check afterwards: an incident belonging to somebody else is never\nloaded, so there is no branch in which one could be returned.","operationId":"list_public_incidents_v1","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"description":"Opaque cursor from the previous page's `next_cursor`","title":"Cursor"},"description":"Opaque cursor from the previous page's `next_cursor`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentPage"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"401":{"description":"A valid X-API-Key header is required","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"WWW-Authenticate":{"description":"API key authentication challenge","schema":{"type":"string","enum":["X-API-Key"]}}}},"403":{"description":"The API key does not carry the scope this route requires","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"404":{"description":"The record is unavailable to this key","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"422":{"description":"The request failed validation","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"429":{"description":"The API key exceeded its rate limit","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"Retry-After":{"description":"Seconds until the current window resets","schema":{"type":"integer"}}}}}}},"/api/v1/public/incidents/{incident_id}":{"get":{"tags":["public-api"],"summary":"One incident, with the findings it was assembled from","description":"An incident from another tenant answers exactly as one that never existed.\n\nSame words, same status, same shape. A 403 here would confirm that the\nidentifier names something real somewhere, which is a fact about another\ncustomer that this caller has no business learning.","operationId":"get_public_incident_v1","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Incident Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicIncidentDetail"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"401":{"description":"A valid X-API-Key header is required","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"WWW-Authenticate":{"description":"API key authentication challenge","schema":{"type":"string","enum":["X-API-Key"]}}}},"403":{"description":"The API key does not carry the scope this route requires","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"404":{"description":"The record is unavailable to this key","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"422":{"description":"The request failed validation","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"429":{"description":"The API key exceeded its rate limit","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"Retry-After":{"description":"Seconds until the current window resets","schema":{"type":"integer"}}}}}}},"/api/v1/public/alerts":{"get":{"tags":["public-api"],"summary":"Alerts belonging to this key's tenant","description":"Most recently opened first.\n\nEntity values are the tenant-salted hashes the platform stores, not the email\naddress or account name behind them. That is not a limitation of this\nendpoint: the platform does not hold the original, so no scope could return\none.","operationId":"list_public_alerts_v1","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"description":"Opaque cursor from the previous page's `next_cursor`","title":"Cursor"},"description":"Opaque cursor from the previous page's `next_cursor`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertPage"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"401":{"description":"A valid X-API-Key header is required","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"WWW-Authenticate":{"description":"API key authentication challenge","schema":{"type":"string","enum":["X-API-Key"]}}}},"403":{"description":"The API key does not carry the scope this route requires","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"404":{"description":"The record is unavailable to this key","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"422":{"description":"The request failed validation","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}}},"429":{"description":"The API key exceeded its rate limit","content":{"application/problem+json":{"schema":{"properties":{"type":{"default":"about:blank","title":"Type","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"integer"},"detail":{"title":"Detail","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["title","status","detail","request_id"],"title":"ProblemDetail","type":"object"}}},"headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"Retry-After":{"description":"Seconds until the current window resets","schema":{"type":"integer"}}}}}}},"/api/v1/public/security-score":{"get":{"tags":["public-api"],"summary":"The current security score for this key's tenant","description":"`scored: false` when there is no snapshot yet, rather than a 404.\n\nA tenant onboarded an hour ago has not been scored. Answering 404 would tell\nan integration the same thing it would be told if the tenant were somebody\nelse's, and a dashboard would render an outage where the truth is \"not yet\".","operationId":"get_public_security_score_v1","responses":{"200":{"description":"Successful Response","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityScoreResponse"}}}},"401":{"description":"A valid X-API-Key header is required","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"WWW-Authenticate":{"description":"API key authentication challenge","schema":{"type":"string","enum":["X-API-Key"]}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}},"403":{"description":"The API key does not carry the scope this route requires","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}},"404":{"description":"The record is unavailable to this key","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}},"422":{"description":"The request failed validation","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}},"429":{"description":"The API key exceeded its rate limit","headers":{"X-Request-ID":{"description":"Safe correlation identifier for this request","schema":{"type":"string"}},"Retry-After":{"description":"Seconds until the current window resets","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"properties":{"type":{"type":"string","title":"Type","default":"about:blank"},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status"},"detail":{"type":"string","title":"Detail"},"request_id":{"type":"string","title":"Request Id"}},"type":"object","required":["title","status","detail","request_id"],"title":"ProblemDetail"}}}}},"security":[{"APIKeyHeader":[]}]}}},"components":{"schemas":{"AlertEntry":{"properties":{"alert_id":{"type":"string","format":"uuid","title":"Alert Id"},"rule_id":{"type":"string","title":"Rule Id"},"title":{"type":"string","title":"Title"},"severity":{"type":"string","title":"Severity"},"status":{"type":"string","title":"Status"},"entity_kind":{"type":"string","title":"Entity Kind"},"entity_value":{"type":"string","title":"Entity Value"},"incident_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Incident Id"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"assigned_to_principal_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assigned To Principal Id"},"opened_at":{"type":"string","format":"date-time","title":"Opened At"}},"additionalProperties":false,"type":"object","required":["alert_id","rule_id","title","severity","status","entity_kind","entity_value","opened_at"],"title":"AlertEntry"},"AlertPage":{"properties":{"alerts":{"items":{"$ref":"#/components/schemas/AlertEntry"},"type":"array","title":"Alerts"},"page":{"$ref":"#/components/schemas/PageInfo"}},"additionalProperties":false,"type":"object","required":["alerts","page"],"title":"AlertPage"},"ApiKeyIdentity":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"api_key_id":{"type":"string","format":"uuid","title":"Api Key Id"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"rate_limit_per_minute":{"type":"integer","title":"Rate Limit Per Minute"}},"additionalProperties":false,"type":"object","required":["tenant_id","api_key_id","scopes","rate_limit_per_minute"],"title":"ApiKeyIdentity","description":"What this key is, so an integration can check itself before it goes live.\n\nExists because the first question every integrator has is \"is my key working\nand what may it do\", and the honest way to answer it is an endpoint rather\nthan a support ticket. It reports the key's own id and scopes; there is no\nparameter for another key and no field that names a secret."},"IncidentEntry":{"properties":{"incident_id":{"type":"string","format":"uuid","title":"Incident Id"},"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary"},"severity":{"type":"string","title":"Severity"},"status":{"type":"string","title":"Status"},"correlation_kind":{"type":"string","title":"Correlation Kind"},"entity_values":{"items":{"type":"string"},"type":"array","title":"Entity Values"},"alert_count":{"type":"integer","title":"Alert Count"},"opened_at":{"type":"string","format":"date-time","title":"Opened At"},"last_activity_at":{"type":"string","format":"date-time","title":"Last Activity At"},"closed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closed At"},"reopened_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reopened At"}},"additionalProperties":false,"type":"object","required":["incident_id","title","summary","severity","status","correlation_kind","entity_values","alert_count","opened_at","last_activity_at"],"title":"IncidentEntry","description":"One attack story."},"IncidentPage":{"properties":{"incidents":{"items":{"$ref":"#/components/schemas/IncidentEntry"},"type":"array","title":"Incidents"},"page":{"$ref":"#/components/schemas/PageInfo"}},"additionalProperties":false,"type":"object","required":["incidents","page"],"title":"IncidentPage"},"PageInfo":{"properties":{"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false}},"additionalProperties":false,"type":"object","title":"PageInfo","description":"Where the next page starts, and whether there is one.\n\n`has_more` is answered by fetching one row past the page rather than by\ncounting the table, so a tenant with a million alerts pays the same as one\nwith ten and neither pays for a number nobody displays."},"PublicIncidentDetail":{"properties":{"incident_id":{"type":"string","format":"uuid","title":"Incident Id"},"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary"},"severity":{"type":"string","title":"Severity"},"status":{"type":"string","title":"Status"},"correlation_kind":{"type":"string","title":"Correlation Kind"},"entity_values":{"items":{"type":"string"},"type":"array","title":"Entity Values"},"alert_count":{"type":"integer","title":"Alert Count"},"opened_at":{"type":"string","format":"date-time","title":"Opened At"},"last_activity_at":{"type":"string","format":"date-time","title":"Last Activity At"},"closed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closed At"},"reopened_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reopened At"},"timeline":{"items":{"$ref":"#/components/schemas/TimelineEntry"},"type":"array","title":"Timeline"}},"additionalProperties":false,"type":"object","required":["incident_id","title","summary","severity","status","correlation_kind","entity_values","alert_count","opened_at","last_activity_at","timeline"],"title":"PublicIncidentDetail","description":"One incident with the findings it was assembled from.\n\nThe AI analyst's notes are deliberately absent. They are a third party's\nopinion about a customer's data, attributed and hedged on the console screen\nthat shows them, and an API field is where that framing gets lost — a\ndownstream system would store the sentence and not the caveat."},"ScoreCategoryEntry":{"properties":{"category":{"type":"string","title":"Category"},"score":{"type":"number","title":"Score"},"weight":{"type":"number","title":"Weight"},"reason":{"type":"string","title":"Reason"},"observations":{"additionalProperties":true,"type":"object","title":"Observations"}},"additionalProperties":false,"type":"object","required":["category","score","weight","reason","observations"],"title":"ScoreCategoryEntry"},"SecurityScoreResponse":{"properties":{"scored":{"type":"boolean","title":"Scored","default":true},"overall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall"},"previous":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Previous"},"movement_reasons":{"items":{"type":"string"},"type":"array","title":"Movement Reasons","default":[]},"categories":{"items":{"$ref":"#/components/schemas/ScoreCategoryEntry"},"type":"array","title":"Categories","default":[]},"captured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Captured At"}},"additionalProperties":false,"type":"object","title":"SecurityScoreResponse","description":"The number, and the sentences that make it actionable.\n\nEvery field is optional because \"we have not scored you yet\" is a real state\nand not an error. A tenant onboarded ten minutes ago has no snapshot, and\nanswering that with a 404 tells the console the same thing it would be told if\nthe tenant belonged to somebody else — which it renders as \"unavailable\", the\nword for an outage."},"TimelineEntry":{"properties":{"alert_id":{"type":"string","title":"Alert Id"},"occurred_at":{"type":"string","title":"Occurred At"},"rule_id":{"type":"string","title":"Rule Id"},"severity":{"type":"string","title":"Severity"},"status":{"type":"string","title":"Status"},"entity":{"additionalProperties":true,"type":"object","title":"Entity"},"observed":{"type":"integer","title":"Observed"},"threshold":{"type":"integer","title":"Threshold"},"reason":{"type":"string","title":"Reason"}},"additionalProperties":false,"type":"object","required":["alert_id","occurred_at","rule_id","severity","status","entity","observed","threshold","reason"],"title":"TimelineEntry"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"},"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}