{"openapi":"3.1.0","info":{"title":"Status API","version":"0.1.0","description":"Public read API for building custom status pages (no auth, CORS enabled) and a management API (Bearer API key). Private pages answer the public routes only to allowed networks, password sessions and org API keys with `pages:read` (others get 404), uncached and without CORS. Push (heartbeat) monitors are pinged with GET or POST `/api/v1/push/{token}` (`?status=down&msg=…` reports a failure; the token is the credential). Inbound alerts (Prometheus Alertmanager, Grafana, or the generic JSON `{ title, status: firing|resolved, component, severity, fingerprint }`) are posted to `/api/v1/inbound/{token}` and open draft incidents for review. The probe protocol is documented in the probe agent README. Each status page's own address also serves Atlassian Statuspage's v2 read API (`/api/v2/*.json`)."},"servers":[{"url":"https://app.upstreamr.com"}],"tags":[{"name":"Public","description":"Unauthenticated, cacheable, CORS-enabled (private pages: see the description above)."},{"name":"Statuspage-compatible","description":"Atlassian Statuspage's v2 read API, on each page's own address."},{"name":"Management","description":"Requires an organization API key."}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Organization API key (sk_...) created in the admin."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]},"Data":{"type":"object","properties":{"data":{}}}},"parameters":{}},"paths":{"/api/v1/pages/{page}":{"get":{"tags":["Public"],"parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"},{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Page metadata, theme and features","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string","enum":["brand","network"]},"description":{"type":["string","null"]},"url":{"type":["string","null"],"format":"uri"},"logoUrl":{"type":["string","null"],"format":"uri"},"logoDarkUrl":{"type":["string","null"],"format":"uri"},"faviconUrl":{"type":["string","null"],"format":"uri"},"websiteUrl":{"type":["string","null"],"format":"uri"},"supportUrl":{"type":["string","null"],"format":"uri"},"timezone":{"type":"string"},"language":{"type":"string","enum":["en","ro"],"description":"Default language of the page (`en`, `ro`)."},"languages":{"type":"array","items":{"type":"string","enum":["en","ro"]},"minItems":1},"theme":{"type":"object","properties":{"mode":{"type":"string","enum":["light","dark","system"],"default":"system"},"radius":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"fontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"headingFontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"fontUrl":{"type":"string","maxLength":512,"format":"uri"},"nav":{"type":"string","enum":["default","center"]},"light":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}},"dark":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}}}},"skin":{"type":"string"},"customCss":{"type":["string","null"]},"features":{"type":"object","properties":{"subscriptions":{"type":"boolean"},"network":{"type":"boolean"},"history":{"type":"boolean"}},"required":["subscriptions","network","history"]},"turnstileSiteKey":{"type":["string","null"],"description":"Cloudflare Turnstile site key when subscribing needs a human check: render the widget with this key and send its token as `turnstileToken`. Null when no token is needed."}},"required":["id","slug","name","kind","description","url","logoUrl","logoDarkUrl","faviconUrl","websiteUrl","supportUrl","timezone","language","languages","theme","skin","customCss","features","turnstileSiteKey"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages/{page}/summary":{"get":{"tags":["Public"],"summary":"Everything needed to render an overview","parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"},{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Current status, component groups, active incidents and maintenances","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string","enum":["brand","network"]},"description":{"type":["string","null"]},"url":{"type":["string","null"],"format":"uri"},"logoUrl":{"type":["string","null"],"format":"uri"},"logoDarkUrl":{"type":["string","null"],"format":"uri"},"faviconUrl":{"type":["string","null"],"format":"uri"},"websiteUrl":{"type":["string","null"],"format":"uri"},"supportUrl":{"type":["string","null"],"format":"uri"},"timezone":{"type":"string"},"language":{"type":"string","enum":["en","ro"],"description":"Default language of the page (`en`, `ro`)."},"languages":{"type":"array","items":{"type":"string","enum":["en","ro"]},"minItems":1},"theme":{"type":"object","properties":{"mode":{"type":"string","enum":["light","dark","system"],"default":"system"},"radius":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"fontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"headingFontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"fontUrl":{"type":"string","maxLength":512,"format":"uri"},"nav":{"type":"string","enum":["default","center"]},"light":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}},"dark":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}}}},"skin":{"type":"string"},"customCss":{"type":["string","null"]},"features":{"type":"object","properties":{"subscriptions":{"type":"boolean"},"network":{"type":"boolean"},"history":{"type":"boolean"}},"required":["subscriptions","network","history"]},"turnstileSiteKey":{"type":["string","null"],"description":"Cloudflare Turnstile site key when subscribing needs a human check: render the widget with this key and send its token as `turnstileToken`. Null when no token is needed."}},"required":["id","slug","name","kind","description","url","logoUrl","logoDarkUrl","faviconUrl","websiteUrl","supportUrl","timezone","language","languages","theme","skin","customCss","features","turnstileSiteKey"]},"status":{"type":"object","properties":{"indicator":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"description":{"type":"string"}},"required":["indicator","description"]},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"collapsed":{"type":"boolean"},"order":{"type":"integer"},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"kind":{"type":"string","enum":["service","network","region","datacenter","pop","server"]},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"showUptime":{"type":"boolean"},"location":{"type":["object","null"],"properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"],"minLength":2,"maxLength":2},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["city","country","lat","lng"]},"order":{"type":"integer"},"game":{"type":["object","null"],"properties":{"players":{"type":["integer","null"]},"maxPlayers":{"type":["integer","null"]},"map":{"type":["string","null"]},"version":{"type":["string","null"]},"updatedAt":{"type":"string","format":"date-time"}},"required":["players","maxPlayers","map","version","updatedAt"]}},"required":["id","name","description","kind","status","showUptime","location","order"]}}},"required":["id","name","status","collapsed","order","components"]}},"activeIncidents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"url":{"type":["string","null"],"format":"uri"},"source":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}},"required":["name","url"]},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["id","name","status"]}},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"body":{"type":"string"},"html":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","status","body","html","createdAt"]}},"recurrence":{"type":["string","null"]},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","kind","title","status","impact","url","source","components","scheduledStart","scheduledEnd","startedAt","resolvedAt","createdAt","updatedAt","updates"]}},"activeMaintenances":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"url":{"type":["string","null"],"format":"uri"},"source":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}},"required":["name","url"]},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["id","name","status"]}},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"body":{"type":"string"},"html":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","status","body","html","createdAt"]}},"recurrence":{"type":["string","null"]},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","kind","title","status","impact","url","source","components","scheduledStart","scheduledEnd","startedAt","resolvedAt","createdAt","updatedAt","updates"]}},"upcomingMaintenances":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"url":{"type":["string","null"],"format":"uri"},"source":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}},"required":["name","url"]},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["id","name","status"]}},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"body":{"type":"string"},"html":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","status","body","html","createdAt"]}},"recurrence":{"type":["string","null"]},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","kind","title","status","impact","url","source","components","scheduledStart","scheduledEnd","startedAt","resolvedAt","createdAt","updatedAt","updates"]}},"generatedAt":{"type":"string","format":"date-time"}},"required":["page","status","groups","activeIncidents","activeMaintenances","upcomingMaintenances","generatedAt"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages/{page}/uptime":{"get":{"tags":["Public"],"parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":365,"default":90},"required":false,"name":"days","in":"query"},{"schema":{"type":"string"},"required":false,"name":"componentId","in":"query"},{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Per-day uptime for each component","content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","format":"date"},"to":{"type":"string","format":"date"},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"uptime":{"type":["number","null"],"minimum":0,"maximum":1},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"uptime":{"type":["number","null"],"minimum":0,"maximum":1},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"downtimeSeconds":{"type":"integer","minimum":0},"incidents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]}},"required":["id","title","impact"]}}},"required":["date","uptime","status","downtimeSeconds","incidents"]}}},"required":["componentId","uptime","days"]}}},"required":["from","to","components"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages/{page}/incidents":{"get":{"tags":["Public"],"parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"},{"schema":{"type":"string","enum":["active","resolved","all"],"default":"all"},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","enum":["incident","maintenance"]},"required":false,"name":"kind","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Incidents, newest first","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"url":{"type":["string","null"],"format":"uri"},"source":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}},"required":["name","url"]},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["id","name","status"]}},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"body":{"type":"string"},"html":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","status","body","html","createdAt"]}},"recurrence":{"type":["string","null"]},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","kind","title","status","impact","url","source","components","scheduledStart","scheduledEnd","startedAt","resolvedAt","createdAt","updatedAt","updates"]}},"nextCursor":{"type":["string","null"]}},"required":["data","nextCursor"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages/{page}/incidents/{id}":{"get":{"tags":["Public"],"parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"One incident or maintenance with all updates","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"url":{"type":["string","null"],"format":"uri"},"source":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}},"required":["name","url"]},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["id","name","status"]}},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"body":{"type":"string"},"html":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","status","body","html","createdAt"]}},"recurrence":{"type":["string","null"]},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","kind","title","status","impact","url","source","components","scheduledStart","scheduledEnd","startedAt","resolvedAt","createdAt","updatedAt","updates"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages/{page}/history":{"get":{"tags":["Public"],"parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$"},"required":false,"name":"before","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":12,"default":3},"required":false,"name":"months","in":"query"},{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Incidents and maintenances grouped by month","content":{"application/json":{"schema":{"type":"object","properties":{"months":{"type":"array","items":{"type":"object","properties":{"month":{"type":"string","pattern":"^\\d{4}-\\d{2}$"},"incidents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"url":{"type":["string","null"],"format":"uri"},"source":{"type":["object","null"],"properties":{"name":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}},"required":["name","url"]},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["id","name","status"]}},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"body":{"type":"string"},"html":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"body":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","status","body","html","createdAt"]}},"recurrence":{"type":["string","null"]},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}},"ro":{"type":"object","properties":{"title":{"type":"string"},"source":{"type":"string","enum":["operator","machine"]}}}}}},"required":["id","kind","title","status","impact","url","source","components","scheduledStart","scheduledEnd","startedAt","resolvedAt","createdAt","updatedAt","updates"]}}},"required":["month","incidents"]}},"nextCursor":{"type":["string","null"]}},"required":["months","nextCursor"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/visitor":{"get":{"tags":["Public"],"summary":"The requester's approximate city, from the edge; used to show the nearest location. Not stored.","responses":{"200":{"description":"City-level location, or nulls when the runtime has none","content":{"application/json":{"schema":{"type":"object","properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"],"minLength":2,"maxLength":2},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["city","country","lat","lng"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages/{page}/network":{"get":{"tags":["Public"],"parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"},{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Probe regions, network components and prefix visibility","content":{"application/json":{"schema":{"type":"object","properties":{"asn":{"type":["integer","null"]},"regions":{"type":"array","items":{"type":"object","properties":{"probeId":{"type":"string"},"name":{"type":"string"},"location":{"type":["object","null"],"properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"],"minLength":2,"maxLength":2},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["city","country","lat","lng"]},"provider":{"type":["string","null"]},"asn":{"type":["integer","null"]},"online":{"type":"boolean"},"lastSeenAt":{"type":["string","null"],"format":"date-time"},"latencyP50Ms":{"type":["number","null"]},"latencyP95Ms":{"type":["number","null"]},"lossRatio":{"type":["number","null"],"minimum":0,"maximum":1}},"required":["probeId","name","location","provider","asn","online","lastSeenAt","latencyP50Ms","latencyP95Ms","lossRatio"]}},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"kind":{"type":"string","enum":["service","network","region","datacenter","pop","server"]},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"showUptime":{"type":"boolean"},"location":{"type":["object","null"],"properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"],"minLength":2,"maxLength":2},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["city","country","lat","lng"]},"order":{"type":"integer"},"game":{"type":["object","null"],"properties":{"players":{"type":["integer","null"]},"maxPlayers":{"type":["integer","null"]},"map":{"type":["string","null"]},"version":{"type":["string","null"]},"updatedAt":{"type":"string","format":"date-time"}},"required":["players","maxPlayers","map","version","updatedAt"]}},"required":["id","name","description","kind","status","showUptime","location","order"]}},"prefixes":{"type":"array","items":{"type":"object","properties":{"prefix":{"type":"string"},"originAsn":{"type":"integer"},"visibility":{"type":["number","null"],"minimum":0,"maximum":1},"seenOrigins":{"type":["array","null"],"items":{"type":"integer"}},"rpki":{"type":"string","enum":["valid","invalid","not_found","unknown"]},"checkedAt":{"type":["string","null"],"format":"date-time"}},"required":["prefix","originAsn","visibility","seenOrigins","rpki","checkedAt"]}},"generatedAt":{"type":"string","format":"date-time"}},"required":["asn","regions","components","prefixes","generatedAt"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages/{page}/subscribers":{"post":{"tags":["Public"],"summary":"Subscribe an email (double opt-in)","description":"Sends a confirmation link; the address gets updates once it confirms. **Human check:** when the page’s `turnstileSiteKey` (`GET /v1/pages/{page}`) is not null, send a Cloudflare Turnstile token from a widget rendered with that key as `turnstileToken`; without one the request is refused with 403 `captcha_required`, and a rejected or reused token with 403 `captcha_failed`. Tokens are single-use. The widget only runs on hostnames it allows (the page’s own address); a headless page elsewhere can link to the hosted page’s subscribe dialog instead. Rate-limited per client IP (429).","parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"componentIds":{"type":"array","items":{"type":"string"},"maxItems":200},"timeZone":{"type":"string","maxLength":64},"language":{"type":"string","enum":["en","ro"]},"turnstileToken":{"type":["string","null"],"maxLength":4096,"description":"Cloudflare Turnstile token. Required when the page’s `turnstileSiteKey` is not null; tokens are single-use and come from the widget rendered with that key on a hostname it allows."}},"required":["email"]}}}},"responses":{"202":{"description":"Confirmation email sent (or already subscribed)","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending_confirmation","already_subscribed"]}},"required":["status"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Human check missing (`captcha_required`) or failed (`captcha_failed`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many subscribe attempts from this IP (`rate_limited`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages/{page}/subscribers/chat":{"post":{"tags":["Public"],"summary":"Subscribe a Discord, Slack or Microsoft Teams channel by its webhook URL","description":"Posts a welcome message to the channel right away; only a webhook that accepts it is saved. Every message carries an unsubscribe link, and a deleted webhook unsubscribes itself. **Human check:** when the page’s `turnstileSiteKey` (`GET /v1/pages/{page}`) is not null, send a Cloudflare Turnstile token from a widget rendered with that key as `turnstileToken`; without one the request is refused with 403 `captcha_required`, and a rejected or reused token with 403 `captcha_failed`. Tokens are single-use. The widget only runs on hostnames it allows (the page’s own address); a headless page elsewhere can link to the hosted page’s subscribe dialog instead. Rate-limited per client IP (429).","parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":512,"format":"uri"},"componentIds":{"type":"array","items":{"type":"string"},"maxItems":200},"language":{"type":"string","enum":["en","ro"]},"turnstileToken":{"type":["string","null"],"maxLength":4096,"description":"Cloudflare Turnstile token. Required when the page’s `turnstileSiteKey` is not null; tokens are single-use and come from the widget rendered with that key on a hostname it allows."}},"required":["url"]}}}},"responses":{"201":{"description":"Subscribed (or already subscribed)","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["subscribed","already_subscribed"]},"channel":{"type":"string","enum":["discord","slack","teams"]}},"required":["status","channel"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Human check missing (`captcha_required`) or failed (`captcha_failed`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many subscribe attempts from this IP (`rate_limited`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pages/{page}/subscribers/telegram":{"post":{"tags":["Public"],"summary":"Start a Telegram subscription (one-time link for the bot)","description":"A Telegram bot can only message a chat that started it, so this returns a one-time code with `t.me` links (a private chat, a group, or a channel where the bot posts as an admin). The chat is subscribed once it sends `/start <code>` to the bot; poll `GET /v1/telegram/links/{code}` to see when. Codes expire after 30 minutes. 503 `telegram_disabled` when this deployment has no Telegram bot. **Human check:** when the page’s `turnstileSiteKey` (`GET /v1/pages/{page}`) is not null, send a Cloudflare Turnstile token from a widget rendered with that key as `turnstileToken`; without one the request is refused with 403 `captcha_required`, and a rejected or reused token with 403 `captcha_failed`. Tokens are single-use. The widget only runs on hostnames it allows (the page’s own address); a headless page elsewhere can link to the hosted page’s subscribe dialog instead. Rate-limited per client IP (429).","parameters":[{"schema":{"type":"string","minLength":1,"example":"hostsrc","description":"Page slug or id"},"required":true,"description":"Page slug or id","name":"page","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"componentIds":{"type":"array","items":{"type":"string"},"maxItems":200},"language":{"type":"string","enum":["en","ro"]},"turnstileToken":{"type":["string","null"],"maxLength":4096,"description":"Cloudflare Turnstile token. Required when the page’s `turnstileSiteKey` is not null; tokens are single-use and come from the widget rendered with that key on a hostname it allows."}}}}}},"responses":{"201":{"description":"One-time link issued","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"botUsername":{"type":"string"},"privateUrl":{"type":"string"},"groupUrl":{"type":"string"},"channelUrl":{"type":"string"},"command":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"required":["code","botUsername","privateUrl","groupUrl","channelUrl","command","expiresAt"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Human check missing (`captcha_required`) or failed (`captcha_failed`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many subscribe attempts from this IP (`rate_limited`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/telegram/links/{code}":{"get":{"tags":["Public"],"summary":"Whether a Telegram subscription link was used","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"code","in":"path"}],"responses":{"200":{"description":"`pending` until the chat sends `/start <code>`, then `connected`; `expired` after 30 minutes","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","connected","expired"]},"chat":{"type":["object","null"],"properties":{"type":{"type":"string","enum":["private","group","supergroup","channel"]},"title":{"type":["string","null"]}},"required":["type","title"]}},"required":["status","chat"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/resolve":{"get":{"tags":["Public"],"summary":"Find the page served on a hostname","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"host","in":"query"}],"responses":{"200":{"description":"The page for this hostname","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string","enum":["brand","network"]},"description":{"type":["string","null"]},"url":{"type":["string","null"],"format":"uri"},"logoUrl":{"type":["string","null"],"format":"uri"},"logoDarkUrl":{"type":["string","null"],"format":"uri"},"faviconUrl":{"type":["string","null"],"format":"uri"},"websiteUrl":{"type":["string","null"],"format":"uri"},"supportUrl":{"type":["string","null"],"format":"uri"},"timezone":{"type":"string"},"language":{"type":"string","enum":["en","ro"],"description":"Default language of the page (`en`, `ro`)."},"languages":{"type":"array","items":{"type":"string","enum":["en","ro"]},"minItems":1},"theme":{"type":"object","properties":{"mode":{"type":"string","enum":["light","dark","system"],"default":"system"},"radius":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"fontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"headingFontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"fontUrl":{"type":"string","maxLength":512,"format":"uri"},"nav":{"type":"string","enum":["default","center"]},"light":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}},"dark":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}}}},"skin":{"type":"string"},"customCss":{"type":["string","null"]},"features":{"type":"object","properties":{"subscriptions":{"type":"boolean"},"network":{"type":"boolean"},"history":{"type":"boolean"}},"required":["subscriptions","network","history"]},"turnstileSiteKey":{"type":["string","null"],"description":"Cloudflare Turnstile site key when subscribing needs a human check: render the widget with this key and send its token as `turnstileToken`. Null when no token is needed."}},"required":["id","slug","name","kind","description","url","logoUrl","logoDarkUrl","faviconUrl","websiteUrl","supportUrl","timezone","language","languages","theme","skin","customCss","features","turnstileSiteKey"]}},"required":["page"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/summary.json":{"get":{"tags":["Statuspage-compatible"],"summary":"Page summary","description":"The overall indicator, every component and group, unresolved incidents, and upcoming and in-progress maintenance. Most consumers only need this. `Accept: text/markdown` returns a short Markdown summary instead. Served on the page's own address only (its custom domain or `<slug>.upstreamr.page`), for that page: there is no `{page}` in the path, and other hosts answer 404.","parameters":[{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Page summary","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"time_zone":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","url","time_zone","updated_at"]},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"position":{"type":"integer"},"description":{"type":["string","null"]},"showcase":{"type":"boolean"},"start_date":{"type":["string","null"]},"group_id":{"type":["string","null"]},"page_id":{"type":"string"},"group":{"type":"boolean"},"only_show_if_degraded":{"type":"boolean"},"components":{"type":"array","items":{"type":"string"}}},"required":["id","name","status","created_at","updated_at","position","description","showcase","start_date","group_id","page_id","group","only_show_if_degraded"]}},"incidents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"monitoring_at":{"type":["string","null"],"format":"date-time"},"resolved_at":{"type":["string","null"],"format":"date-time"},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"shortlink":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"page_id":{"type":"string"},"incident_updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed"]}]},"body":{"type":"string"},"incident_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"display_at":{"type":"string","format":"date-time"},"affected_components":{"type":["array","null"],"items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"old_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"new_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["code","name","old_status","new_status"]}},"deliver_notifications":{"type":"boolean"},"custom_tweet":{"type":["string","null"]},"tweet_id":{"type":["string","null"]}},"required":["id","status","body","incident_id","created_at","updated_at","display_at","affected_components","deliver_notifications","custom_tweet","tweet_id"]}},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"position":{"type":"integer"},"description":{"type":["string","null"]},"showcase":{"type":"boolean"},"start_date":{"type":["string","null"]},"group_id":{"type":["string","null"]},"page_id":{"type":"string"},"group":{"type":"boolean"},"only_show_if_degraded":{"type":"boolean"},"components":{"type":"array","items":{"type":"string"}}},"required":["id","name","status","created_at","updated_at","position","description","showcase","start_date","group_id","page_id","group","only_show_if_degraded"]}},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},"reminder_intervals":{"type":["string","null"]}},"required":["id","name","created_at","updated_at","monitoring_at","resolved_at","impact","shortlink","started_at","page_id","incident_updates","components","status","reminder_intervals"]}},"scheduled_maintenances":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"monitoring_at":{"type":["string","null"],"format":"date-time"},"resolved_at":{"type":["string","null"],"format":"date-time"},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"shortlink":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"page_id":{"type":"string"},"incident_updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed"]}]},"body":{"type":"string"},"incident_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"display_at":{"type":"string","format":"date-time"},"affected_components":{"type":["array","null"],"items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"old_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"new_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["code","name","old_status","new_status"]}},"deliver_notifications":{"type":"boolean"},"custom_tweet":{"type":["string","null"]},"tweet_id":{"type":["string","null"]}},"required":["id","status","body","incident_id","created_at","updated_at","display_at","affected_components","deliver_notifications","custom_tweet","tweet_id"]}},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"position":{"type":"integer"},"description":{"type":["string","null"]},"showcase":{"type":"boolean"},"start_date":{"type":["string","null"]},"group_id":{"type":["string","null"]},"page_id":{"type":"string"},"group":{"type":"boolean"},"only_show_if_degraded":{"type":"boolean"},"components":{"type":"array","items":{"type":"string"}}},"required":["id","name","status","created_at","updated_at","position","description","showcase","start_date","group_id","page_id","group","only_show_if_degraded"]}},"status":{"type":"string","enum":["scheduled","in_progress","verifying","completed"]},"scheduled_for":{"type":["string","null"],"format":"date-time"},"scheduled_until":{"type":["string","null"],"format":"date-time"}},"required":["id","name","created_at","updated_at","monitoring_at","resolved_at","impact","shortlink","started_at","page_id","incident_updates","components","status","scheduled_for","scheduled_until"]}},"status":{"type":"object","properties":{"indicator":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"description":{"type":"string"}},"required":["indicator","description"]}},"required":["page","components","incidents","scheduled_maintenances","status"]}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/status.json":{"get":{"tags":["Statuspage-compatible"],"summary":"Page status","description":"The overall indicator (`none`, `minor`, `major`, `critical`, `maintenance`) and its description. Served on the page's own address only (its custom domain or `<slug>.upstreamr.page`), for that page: there is no `{page}` in the path, and other hosts answer 404.","parameters":[{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Page status","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"time_zone":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","url","time_zone","updated_at"]},"status":{"type":"object","properties":{"indicator":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"description":{"type":"string"}},"required":["indicator","description"]}},"required":["page","status"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/components.json":{"get":{"tags":["Statuspage-compatible"],"summary":"Components","description":"Every component and group with its status. Served on the page's own address only (its custom domain or `<slug>.upstreamr.page`), for that page: there is no `{page}` in the path, and other hosts answer 404.","parameters":[{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Components","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"time_zone":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","url","time_zone","updated_at"]},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"position":{"type":"integer"},"description":{"type":["string","null"]},"showcase":{"type":"boolean"},"start_date":{"type":["string","null"]},"group_id":{"type":["string","null"]},"page_id":{"type":"string"},"group":{"type":"boolean"},"only_show_if_degraded":{"type":"boolean"},"components":{"type":"array","items":{"type":"string"}}},"required":["id","name","status","created_at","updated_at","position","description","showcase","start_date","group_id","page_id","group","only_show_if_degraded"]}}},"required":["page","components"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/incidents/unresolved.json":{"get":{"tags":["Statuspage-compatible"],"summary":"Unresolved incidents","description":"Incidents in the `investigating`, `identified` or `monitoring` state, newest first. Served on the page's own address only (its custom domain or `<slug>.upstreamr.page`), for that page: there is no `{page}` in the path, and other hosts answer 404.","parameters":[{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Unresolved incidents","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"time_zone":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","url","time_zone","updated_at"]},"incidents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"monitoring_at":{"type":["string","null"],"format":"date-time"},"resolved_at":{"type":["string","null"],"format":"date-time"},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"shortlink":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"page_id":{"type":"string"},"incident_updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed"]}]},"body":{"type":"string"},"incident_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"display_at":{"type":"string","format":"date-time"},"affected_components":{"type":["array","null"],"items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"old_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"new_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["code","name","old_status","new_status"]}},"deliver_notifications":{"type":"boolean"},"custom_tweet":{"type":["string","null"]},"tweet_id":{"type":["string","null"]}},"required":["id","status","body","incident_id","created_at","updated_at","display_at","affected_components","deliver_notifications","custom_tweet","tweet_id"]}},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"position":{"type":"integer"},"description":{"type":["string","null"]},"showcase":{"type":"boolean"},"start_date":{"type":["string","null"]},"group_id":{"type":["string","null"]},"page_id":{"type":"string"},"group":{"type":"boolean"},"only_show_if_degraded":{"type":"boolean"},"components":{"type":"array","items":{"type":"string"}}},"required":["id","name","status","created_at","updated_at","position","description","showcase","start_date","group_id","page_id","group","only_show_if_degraded"]}},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},"reminder_intervals":{"type":["string","null"]}},"required":["id","name","created_at","updated_at","monitoring_at","resolved_at","impact","shortlink","started_at","page_id","incident_updates","components","status","reminder_intervals"]}}},"required":["page","incidents"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/incidents.json":{"get":{"tags":["Statuspage-compatible"],"summary":"All incidents","description":"The 50 most recent incidents, resolved ones included, newest first. Served on the page's own address only (its custom domain or `<slug>.upstreamr.page`), for that page: there is no `{page}` in the path, and other hosts answer 404.","parameters":[{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"All incidents","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"time_zone":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","url","time_zone","updated_at"]},"incidents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"monitoring_at":{"type":["string","null"],"format":"date-time"},"resolved_at":{"type":["string","null"],"format":"date-time"},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"shortlink":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"page_id":{"type":"string"},"incident_updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed"]}]},"body":{"type":"string"},"incident_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"display_at":{"type":"string","format":"date-time"},"affected_components":{"type":["array","null"],"items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"old_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"new_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["code","name","old_status","new_status"]}},"deliver_notifications":{"type":"boolean"},"custom_tweet":{"type":["string","null"]},"tweet_id":{"type":["string","null"]}},"required":["id","status","body","incident_id","created_at","updated_at","display_at","affected_components","deliver_notifications","custom_tweet","tweet_id"]}},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"position":{"type":"integer"},"description":{"type":["string","null"]},"showcase":{"type":"boolean"},"start_date":{"type":["string","null"]},"group_id":{"type":["string","null"]},"page_id":{"type":"string"},"group":{"type":"boolean"},"only_show_if_degraded":{"type":"boolean"},"components":{"type":"array","items":{"type":"string"}}},"required":["id","name","status","created_at","updated_at","position","description","showcase","start_date","group_id","page_id","group","only_show_if_degraded"]}},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},"reminder_intervals":{"type":["string","null"]}},"required":["id","name","created_at","updated_at","monitoring_at","resolved_at","impact","shortlink","started_at","page_id","incident_updates","components","status","reminder_intervals"]}}},"required":["page","incidents"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/scheduled-maintenances/upcoming.json":{"get":{"tags":["Statuspage-compatible"],"summary":"Upcoming maintenance","description":"Maintenance still in the `scheduled` state, soonest first. Served on the page's own address only (its custom domain or `<slug>.upstreamr.page`), for that page: there is no `{page}` in the path, and other hosts answer 404.","parameters":[{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Upcoming maintenance","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"time_zone":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","url","time_zone","updated_at"]},"scheduled_maintenances":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"monitoring_at":{"type":["string","null"],"format":"date-time"},"resolved_at":{"type":["string","null"],"format":"date-time"},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"shortlink":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"page_id":{"type":"string"},"incident_updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed"]}]},"body":{"type":"string"},"incident_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"display_at":{"type":"string","format":"date-time"},"affected_components":{"type":["array","null"],"items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"old_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"new_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["code","name","old_status","new_status"]}},"deliver_notifications":{"type":"boolean"},"custom_tweet":{"type":["string","null"]},"tweet_id":{"type":["string","null"]}},"required":["id","status","body","incident_id","created_at","updated_at","display_at","affected_components","deliver_notifications","custom_tweet","tweet_id"]}},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"position":{"type":"integer"},"description":{"type":["string","null"]},"showcase":{"type":"boolean"},"start_date":{"type":["string","null"]},"group_id":{"type":["string","null"]},"page_id":{"type":"string"},"group":{"type":"boolean"},"only_show_if_degraded":{"type":"boolean"},"components":{"type":"array","items":{"type":"string"}}},"required":["id","name","status","created_at","updated_at","position","description","showcase","start_date","group_id","page_id","group","only_show_if_degraded"]}},"status":{"type":"string","enum":["scheduled","in_progress","verifying","completed"]},"scheduled_for":{"type":["string","null"],"format":"date-time"},"scheduled_until":{"type":["string","null"],"format":"date-time"}},"required":["id","name","created_at","updated_at","monitoring_at","resolved_at","impact","shortlink","started_at","page_id","incident_updates","components","status","scheduled_for","scheduled_until"]}}},"required":["page","scheduled_maintenances"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/scheduled-maintenances/active.json":{"get":{"tags":["Statuspage-compatible"],"summary":"Active maintenance","description":"Maintenance in the `in_progress` or `verifying` state. Served on the page's own address only (its custom domain or `<slug>.upstreamr.page`), for that page: there is no `{page}` in the path, and other hosts answer 404.","parameters":[{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"Active maintenance","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"time_zone":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","url","time_zone","updated_at"]},"scheduled_maintenances":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"monitoring_at":{"type":["string","null"],"format":"date-time"},"resolved_at":{"type":["string","null"],"format":"date-time"},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"shortlink":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"page_id":{"type":"string"},"incident_updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed"]}]},"body":{"type":"string"},"incident_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"display_at":{"type":"string","format":"date-time"},"affected_components":{"type":["array","null"],"items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"old_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"new_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["code","name","old_status","new_status"]}},"deliver_notifications":{"type":"boolean"},"custom_tweet":{"type":["string","null"]},"tweet_id":{"type":["string","null"]}},"required":["id","status","body","incident_id","created_at","updated_at","display_at","affected_components","deliver_notifications","custom_tweet","tweet_id"]}},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"position":{"type":"integer"},"description":{"type":["string","null"]},"showcase":{"type":"boolean"},"start_date":{"type":["string","null"]},"group_id":{"type":["string","null"]},"page_id":{"type":"string"},"group":{"type":"boolean"},"only_show_if_degraded":{"type":"boolean"},"components":{"type":"array","items":{"type":"string"}}},"required":["id","name","status","created_at","updated_at","position","description","showcase","start_date","group_id","page_id","group","only_show_if_degraded"]}},"status":{"type":"string","enum":["scheduled","in_progress","verifying","completed"]},"scheduled_for":{"type":["string","null"],"format":"date-time"},"scheduled_until":{"type":["string","null"],"format":"date-time"}},"required":["id","name","created_at","updated_at","monitoring_at","resolved_at","impact","shortlink","started_at","page_id","incident_updates","components","status","scheduled_for","scheduled_until"]}}},"required":["page","scheduled_maintenances"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/scheduled-maintenances.json":{"get":{"tags":["Statuspage-compatible"],"summary":"All maintenance","description":"The 50 most recent maintenances, completed ones included, latest window first. Served on the page's own address only (its custom domain or `<slug>.upstreamr.page`), for that page: there is no `{page}` in the path, and other hosts answer 404.","parameters":[{"schema":{"type":"string","maxLength":16,"example":"ro","description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written."},"required":false,"description":"Language for the human-readable texts: the page's state, the scheduler's own updates and recurrence descriptions. One of the page's `languages`; anything else means its default. Texts the team wrote (titles, updates, component and group names, the description) come in this language when the team wrote it, else as written.","name":"lang","in":"query"}],"responses":{"200":{"description":"All maintenance","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"time_zone":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","name","url","time_zone","updated_at"]},"scheduled_maintenances":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"monitoring_at":{"type":["string","null"],"format":"date-time"},"resolved_at":{"type":["string","null"],"format":"date-time"},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"shortlink":{"type":"string"},"started_at":{"type":"string","format":"date-time"},"page_id":{"type":"string"},"incident_updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved","postmortem"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed"]}]},"body":{"type":"string"},"incident_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"display_at":{"type":"string","format":"date-time"},"affected_components":{"type":["array","null"],"items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"old_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"new_status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["code","name","old_status","new_status"]}},"deliver_notifications":{"type":"boolean"},"custom_tweet":{"type":["string","null"]},"tweet_id":{"type":["string","null"]}},"required":["id","status","body","incident_id","created_at","updated_at","display_at","affected_components","deliver_notifications","custom_tweet","tweet_id"]}},"components":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"position":{"type":"integer"},"description":{"type":["string","null"]},"showcase":{"type":"boolean"},"start_date":{"type":["string","null"]},"group_id":{"type":["string","null"]},"page_id":{"type":"string"},"group":{"type":"boolean"},"only_show_if_degraded":{"type":"boolean"},"components":{"type":"array","items":{"type":"string"}}},"required":["id","name","status","created_at","updated_at","position","description","showcase","start_date","group_id","page_id","group","only_show_if_degraded"]}},"status":{"type":"string","enum":["scheduled","in_progress","verifying","completed"]},"scheduled_for":{"type":["string","null"],"format":"date-time"},"scheduled_until":{"type":["string","null"],"format":"date-time"}},"required":["id","name","created_at","updated_at","monitoring_at","resolved_at","impact","shortlink","started_at","page_id","incident_updates","components","status","scheduled_for","scheduled_until"]}}},"required":["page","scheduled_maintenances"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages":{"get":{"summary":"List pages","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create a page","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$"},"name":{"type":"string","minLength":1,"maxLength":120},"kind":{"type":"string","enum":["brand","network"],"default":"brand"},"description":{"type":["string","null"],"maxLength":2000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"description":{"type":["string","null"],"maxLength":2000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"description":{"type":["string","null"],"maxLength":2000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"logoDarkUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"faviconUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"websiteUrl":{"type":["string","null"],"format":"uri"},"supportUrl":{"type":["string","null"],"format":"uri"},"timezone":{"type":"string","default":"UTC"},"language":{"type":"string","enum":["en","ro"]},"languages":{"type":"array","items":{"type":"string","enum":["en","ro"]},"maxItems":2},"theme":{"type":"object","properties":{"mode":{"type":"string","enum":["light","dark","system"],"default":"system"},"radius":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"fontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"headingFontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"fontUrl":{"type":"string","maxLength":512,"format":"uri"},"nav":{"type":"string","enum":["default","center"]},"light":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}},"dark":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}}}},"skin":{"type":"string","pattern":"^[a-z0-9-]{1,32}$","default":"default"},"customCss":{"type":["string","null"],"maxLength":32768},"mirrorOfPageId":{"type":["string","null"]},"asn":{"type":["integer","null"],"exclusiveMinimum":0},"emailFromName":{"type":["string","null"],"maxLength":120},"emailFromAddress":{"type":["string","null"],"format":"email"},"chatStyle":{"type":["object","null"],"properties":{"name":{"type":["string","null"],"maxLength":80},"avatarUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"bannerUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"footer":{"type":["string","null"],"maxLength":200},"showPageStatus":{"type":"boolean","default":true},"showStep":{"type":"boolean","default":true},"showAffected":{"type":"boolean","default":true},"affectedGroup":{"type":"boolean","default":true},"affectedLocation":{"type":"boolean","default":true},"showWindow":{"type":"boolean","default":true},"showCreated":{"type":"boolean","default":true},"titlePrefix":{"type":"boolean","default":false},"compactFollowUps":{"type":"boolean","default":true}}},"maintenanceReminders":{"type":"array","items":{"type":"string","enum":["1w","48h","24h","1h"]},"maxItems":3,"description":"Reminders before a scheduled maintenance: up to three of 1w, 48h, 24h, 1h, each sent once per window. Default ['24h', '1h']; [] = none."},"maintenanceReminder":{"type":"string","enum":["off","1h","24h","48h","1w"],"description":"Deprecated: one reminder (off = none). Use maintenanceReminders; it wins when both are set."},"maintenanceNotifyStart":{"type":"boolean"},"maintenanceNotifyEnd":{"type":"boolean"},"published":{"type":"boolean","default":true}},"required":["slug","name"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}":{"patch":{"summary":"Update a page","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$"},"name":{"type":"string","minLength":1,"maxLength":120},"kind":{"type":"string","enum":["brand","network"]},"description":{"type":["string","null"],"maxLength":2000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"description":{"type":["string","null"],"maxLength":2000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"description":{"type":["string","null"],"maxLength":2000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"logoDarkUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"faviconUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"websiteUrl":{"type":["string","null"],"format":"uri"},"supportUrl":{"type":["string","null"],"format":"uri"},"timezone":{"type":"string"},"language":{"type":"string","enum":["en","ro"]},"languages":{"type":"array","items":{"type":"string","enum":["en","ro"]},"maxItems":2},"theme":{"type":"object","properties":{"mode":{"type":"string","enum":["light","dark","system"],"default":"system"},"radius":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"fontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"headingFontFamily":{"type":"string","maxLength":200,"pattern":"^[\\w\\s,'\"-]+$"},"fontUrl":{"type":"string","maxLength":512,"format":"uri"},"nav":{"type":"string","enum":["default","center"]},"light":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}},"dark":{"type":"object","properties":{"background":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"card-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"popover-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"secondary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"muted-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"border":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"input":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"ring":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"primary-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"accent-foreground":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-operational":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-degraded":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-partial":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-major":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"},"status-maintenance":{"type":"string","maxLength":64,"pattern":"^[#a-zA-Z0-9.,%()\\s/-]+$"}},"default":{}}}},"skin":{"type":"string","pattern":"^[a-z0-9-]{1,32}$"},"customCss":{"type":["string","null"],"maxLength":32768},"mirrorOfPageId":{"type":["string","null"]},"asn":{"type":["integer","null"],"exclusiveMinimum":0},"emailFromName":{"type":["string","null"],"maxLength":120},"emailFromAddress":{"type":["string","null"],"format":"email"},"chatStyle":{"type":["object","null"],"properties":{"name":{"type":["string","null"],"maxLength":80},"avatarUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"bannerUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"footer":{"type":["string","null"],"maxLength":200},"showPageStatus":{"type":"boolean","default":true},"showStep":{"type":"boolean","default":true},"showAffected":{"type":"boolean","default":true},"affectedGroup":{"type":"boolean","default":true},"affectedLocation":{"type":"boolean","default":true},"showWindow":{"type":"boolean","default":true},"showCreated":{"type":"boolean","default":true},"titlePrefix":{"type":"boolean","default":false},"compactFollowUps":{"type":"boolean","default":true}}},"maintenanceReminders":{"type":"array","items":{"type":"string","enum":["1w","48h","24h","1h"]},"maxItems":3,"description":"Reminders before a scheduled maintenance: up to three of 1w, 48h, 24h, 1h, each sent once per window. Default ['24h', '1h']; [] = none."},"maintenanceReminder":{"type":"string","enum":["off","1h","24h","48h","1w"],"description":"Deprecated: one reminder (off = none). Use maintenanceReminders; it wins when both are set."},"maintenanceNotifyStart":{"type":"boolean"},"maintenanceNotifyEnd":{"type":"boolean"},"published":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Delete a page","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/groups":{"get":{"summary":"List component groups of a page","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/groups":{"post":{"summary":"Create a component group","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pageId":{"type":"string"},"name":{"type":"string","minLength":1,"maxLength":120},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"order":{"type":"integer","default":0},"collapsed":{"type":"boolean","default":false}},"required":["pageId","name"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/groups/{id}":{"patch":{"summary":"Update a component group","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"order":{"type":"integer"},"collapsed":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Delete a component group","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/components":{"get":{"summary":"List components with live status","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create a component","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":["string","null"],"maxLength":2000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120},"description":{"type":["string","null"],"maxLength":2000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120},"description":{"type":["string","null"],"maxLength":2000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"kind":{"type":"string","enum":["service","network","region","datacenter","pop","server"],"default":"service"},"statusOverride":{"type":["string","null"],"enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance",null]},"location":{"type":["object","null"],"properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"],"minLength":2,"maxLength":2},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["city","country","lat","lng"]},"placements":{"type":"array","items":{"type":"object","properties":{"pageId":{"type":"string"},"groupId":{"type":["string","null"]},"displayName":{"type":["string","null"],"maxLength":120},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"displayName":{"type":["string","null"],"maxLength":120},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"displayName":{"type":["string","null"],"maxLength":120},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"order":{"type":"integer","default":0},"showUptime":{"type":"boolean","default":true}},"required":["pageId"]},"default":[]}},"required":["name"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/components/{id}":{"patch":{"summary":"Update a component (incl. status override, placements)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":["string","null"],"maxLength":2000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120},"description":{"type":["string","null"],"maxLength":2000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":120},"description":{"type":["string","null"],"maxLength":2000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"kind":{"type":"string","enum":["service","network","region","datacenter","pop","server"]},"statusOverride":{"type":["string","null"],"enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance",null]},"location":{"type":["object","null"],"properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"],"minLength":2,"maxLength":2},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["city","country","lat","lng"]},"placements":{"type":"array","items":{"type":"object","properties":{"pageId":{"type":"string"},"groupId":{"type":["string","null"]},"displayName":{"type":["string","null"],"maxLength":120},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"displayName":{"type":["string","null"],"maxLength":120},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"displayName":{"type":["string","null"],"maxLength":120},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"order":{"type":"integer","default":0},"showUptime":{"type":"boolean","default":true}},"required":["pageId"]}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Delete a component","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/events":{"get":{"summary":"List incidents and maintenances (newest first, cursor-paged)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["open","resolved","all"],"default":"all"},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","enum":["incident","maintenance"]},"required":false,"name":"kind","in":"query"},{"schema":{"type":"string","enum":["own","upstream","all"],"default":"all","description":"`own`: your incidents and maintenances; `upstream`: imported provider reports (never public)"},"required":false,"description":"`own`: your incidents and maintenances; `upstream`: imported provider reports (never public)","name":"origin","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{},"nextCursor":{"type":["string","null"]}},"required":["nextCursor"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create an incident or maintenance","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string","minLength":1,"maxLength":200},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"message":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"pageIds":{"type":"array","items":{"type":"string"}},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["componentId","status"]},"default":[]},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"autoTransition":{"type":"boolean","default":true},"notify":{"type":"boolean","default":true},"reminders":{"type":["array","null"],"items":{"type":"string","enum":["1w","48h","24h","1h"]},"maxItems":3,"description":"Maintenance only: up to three of 1w, 48h, 24h, 1h, each sent once per window; [] = none; null = each page's setting."},"reminder":{"type":["string","null"],"enum":["off","1h","24h","48h","1w",null],"description":"Deprecated: one reminder (off = none). Use reminders; it wins when both are set."},"fillPlaceholders":{"type":"boolean"},"templateId":{"type":["string","null"]}},"required":["kind","title","status","impact","message"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/events/{id}":{"get":{"summary":"Get an event with updates, components and pages","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Edit title, impact, window or pages","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"pageIds":{"type":"array","items":{"type":"string"}},"autoTransition":{"type":"boolean"},"reminders":{"type":["array","null"],"items":{"type":"string","enum":["1w","48h","24h","1h"]},"maxItems":3,"description":"Maintenance only: up to three of 1w, 48h, 24h, 1h, each sent once per window; [] = none; null = each page's setting."},"reminder":{"type":["string","null"],"enum":["off","1h","24h","48h","1w",null],"description":"Deprecated: one reminder (off = none). Use reminders; it wins when both are set."}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Delete an incident or maintenance","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/events/{id}/updates":{"post":{"summary":"Post an update (status change + message)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"message":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["componentId","status"]},"default":[]},"notify":{"type":"boolean","default":true}},"required":["status","message"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/events/{id}/updates/{updateId}":{"patch":{"summary":"Correct a posted update's text (no new notifications)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"updateId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."}},"required":["message"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/events/{id}/acknowledge":{"post":{"summary":"Acknowledge an upstream provider report (or clear it)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"acknowledged":{"type":"boolean"}},"required":["acknowledged"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/events/{id}/publish":{"get":{"summary":"Draft for publishing an upstream provider report on your pages (nothing is saved)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Publish an upstream provider report as your own incident or maintenance (409 if already published)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string","minLength":1,"maxLength":200},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"message":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"pageIds":{"type":"array","items":{"type":"string"}},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["componentId","status"]},"default":[]},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"autoTransition":{"type":"boolean","default":true},"notify":{"type":"boolean","default":true},"reminders":{"type":["array","null"],"items":{"type":"string","enum":["1w","48h","24h","1h"]},"maxItems":3,"description":"Maintenance only: up to three of 1w, 48h, 24h, 1h, each sent once per window; [] = none; null = each page's setting."},"reminder":{"type":["string","null"],"enum":["off","1h","24h","48h","1w",null],"description":"Deprecated: one reminder (off = none). Use reminders; it wins when both are set."},"fillPlaceholders":{"type":"boolean"},"templateId":{"type":["string","null"]}},"required":["kind","title","status","impact","message"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/events/{id}/follow-up":{"get":{"summary":"Draft a follow-up from the provider's latest changes (nothing is saved or sent)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Post a follow-up on a published event and mark the provider change reviewed","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"message":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["componentId","status"]},"default":[]},"notify":{"type":"boolean","default":true},"upstreamUpdatedAt":{"type":"string","format":"date-time"}},"required":["status","message","upstreamUpdatedAt"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/templates":{"get":{"summary":"List incident and maintenance templates","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create a template","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string","minLength":1,"maxLength":200},"body":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"body":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"body":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["componentId","status"]},"maxItems":200,"default":[]}},"required":["name","kind","title","body","status","impact"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/templates/{id}":{"patch":{"summary":"Replace a template (send every field)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string","minLength":1,"maxLength":200},"body":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"body":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"body":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["componentId","status"]},"maxItems":200,"default":[]}},"required":["name","kind","title","body","status","impact"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Delete a template (events made from it stay)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/maintenance-series":{"get":{"summary":"List active recurring maintenances with their upcoming occurrences","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create a recurring maintenance (its next occurrences are created at once)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"message":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"schedule":{"type":"object","properties":{"rule":{"oneOf":[{"type":"object","properties":{"freq":{"type":"string","enum":["weekly"]},"interval":{"type":"integer","minimum":1,"maximum":8,"default":1},"weekdays":{"type":"array","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"]},"minItems":1,"maxItems":7}},"required":["freq","weekdays"]},{"type":"object","properties":{"freq":{"type":"string","enum":["monthly"]},"interval":{"type":"integer","minimum":1,"maximum":12,"default":1},"day":{"type":"integer","minimum":1,"maximum":31}},"required":["freq","day"]},{"type":"object","properties":{"freq":{"type":"string","enum":["monthly_weekday"]},"interval":{"type":"integer","minimum":1,"maximum":12,"default":1},"week":{"anyOf":[{"type":"number","enum":[1]},{"type":"number","enum":[2]},{"type":"number","enum":[3]},{"type":"number","enum":[4]},{"type":"number","enum":[-1]}]},"weekday":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"]}},"required":["freq","week","weekday"]}]},"timeZone":{"type":"string","minLength":1,"maxLength":64},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"until":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"startTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"endTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["rule","timeZone","startDate","startTime","endTime"]},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["componentId","status"]},"default":[]},"pageIds":{"type":["array","null"],"items":{"type":"string"}},"autoTransition":{"type":"boolean","default":true},"notify":{"type":"boolean","default":true},"reminders":{"type":["array","null"],"items":{"type":"string","enum":["1w","48h","24h","1h"]},"maxItems":3,"description":"Maintenance only: up to three of 1w, 48h, 24h, 1h, each sent once per window; [] = none; null = each page's setting."},"reminder":{"type":["string","null"],"enum":["off","1h","24h","48h","1w",null],"description":"Deprecated: one reminder (off = none). Use reminders; it wins when both are set."},"templateId":{"type":["string","null"]}},"required":["title","message","schedule"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/maintenance-series/{id}":{"get":{"summary":"Get a recurring maintenance","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Edit every future occurrence that was not edited on its own","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"message":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"schedule":{"type":"object","properties":{"rule":{"oneOf":[{"type":"object","properties":{"freq":{"type":"string","enum":["weekly"]},"interval":{"type":"integer","minimum":1,"maximum":8,"default":1},"weekdays":{"type":"array","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"]},"minItems":1,"maxItems":7}},"required":["freq","weekdays"]},{"type":"object","properties":{"freq":{"type":"string","enum":["monthly"]},"interval":{"type":"integer","minimum":1,"maximum":12,"default":1},"day":{"type":"integer","minimum":1,"maximum":31}},"required":["freq","day"]},{"type":"object","properties":{"freq":{"type":"string","enum":["monthly_weekday"]},"interval":{"type":"integer","minimum":1,"maximum":12,"default":1},"week":{"anyOf":[{"type":"number","enum":[1]},{"type":"number","enum":[2]},{"type":"number","enum":[3]},{"type":"number","enum":[4]},{"type":"number","enum":[-1]}]},"weekday":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"]}},"required":["freq","week","weekday"]}]},"timeZone":{"type":"string","minLength":1,"maxLength":64},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"until":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"startTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"endTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}},"required":["rule","timeZone","startDate","startTime","endTime"]},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["componentId","status"]}},"pageIds":{"type":["array","null"],"items":{"type":"string"}},"autoTransition":{"type":"boolean"},"notify":{"type":"boolean"},"reminders":{"type":["array","null"],"items":{"type":"string","enum":["1w","48h","24h","1h"]},"maxItems":3,"description":"Maintenance only: up to three of 1w, 48h, 24h, 1h, each sent once per window; [] = none; null = each page's setting."},"reminder":{"type":["string","null"],"enum":["off","1h","24h","48h","1w",null],"description":"Deprecated: one reminder (off = none). Use reminders; it wins when both are set."},"templateId":{"type":["string","null"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/maintenance-series/{id}/cancel":{"post":{"summary":"End a recurring maintenance and cancel its occurrences that have not started","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/monitors":{"get":{"summary":"List monitors with current state","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create a monitor","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"componentId":{"type":["string","null"]},"type":{"type":"string","enum":["http","tcp","icmp","dns","tls","push","game","domain"]},"target":{"type":"string","maxLength":2048},"intervalSeconds":{"type":"integer","minimum":30,"maximum":604800,"default":60},"timeoutMs":{"type":"integer","minimum":500,"maximum":60000,"default":10000},"degradedLatencyMs":{"type":["integer","null"],"exclusiveMinimum":0},"config":{"type":"object","properties":{"http":{"type":"object","properties":{"method":{"type":"string","enum":["GET","HEAD","POST"],"default":"GET"},"expectedStatus":{"type":"array","items":{"type":"integer"},"default":[200,201,202,203,204,301,302,304]},"headers":{"type":"object","additionalProperties":{"type":"string"},"default":{}},"body":{"type":["string","null"],"maxLength":10000},"bodyContains":{"type":["string","null"],"maxLength":500},"followRedirects":{"type":"boolean","default":true},"verifyTls":{"type":"boolean","default":true}}},"dns":{"type":"object","properties":{"recordType":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT","CAA","SOA"],"default":"A"},"expected":{"type":"array","items":{"type":"string","maxLength":500},"maxItems":50,"default":[]},"match":{"type":"string","enum":["anyOf","contains","equals"],"default":"anyOf"},"mismatch":{"type":"string","enum":["down","degraded"],"default":"down"},"resolver":{"type":["string","null"]}}},"icmp":{"type":"object","properties":{"count":{"type":"integer","minimum":1,"maximum":20,"default":5},"maxLossRatio":{"type":"number","minimum":0,"maximum":1,"default":0.5}}},"tls":{"type":"object","properties":{"minDaysValid":{"type":"integer","minimum":0,"default":0},"warnDays":{"type":"integer","minimum":0,"maximum":365,"default":14},"serverName":{"type":["string","null"]}}},"domain":{"type":"object","properties":{"warnDays":{"type":"integer","minimum":0,"maximum":365,"default":30},"downDays":{"type":"integer","minimum":0,"maximum":365,"default":0}}},"game":{"type":"object","properties":{"game":{"type":"string","pattern":"^[a-z0-9-]{1,40}$","default":"custom"},"protocol":{"type":"string","enum":["minecraft","bedrock","a2s","fivem","quake3","satisfactory","mumble","teamspeak3","tshock","palworld","gamespy1","gamespy2","gamespy3","ase","unreal2","doom3","quake2","battlefield"]},"queryPort":{"type":["integer","null"],"minimum":1,"maximum":65535},"tcpPort":{"type":["integer","null"],"minimum":1,"maximum":65535},"graceSeconds":{"type":"integer","minimum":0,"maximum":3600,"default":0},"minPlayers":{"type":["integer","null"],"minimum":1,"maximum":100000},"expectVersion":{"type":["string","null"],"minLength":1,"maxLength":64},"username":{"type":["string","null"],"maxLength":64},"password":{"type":["string","null"],"maxLength":256},"publicFields":{"type":"array","items":{"type":"string","enum":["players","map","version"]},"maxItems":3,"default":["players"]}},"required":["protocol"]},"push":{"type":"object","properties":{"graceSeconds":{"type":"integer","minimum":0,"maximum":86400}}}},"default":{}},"probeIds":{"type":"array","items":{"type":"string"},"default":[]},"quorum":{"type":"integer","minimum":1,"maximum":20,"default":2},"traceOnFailure":{"type":"boolean","default":true},"enabled":{"type":"boolean","default":true}},"required":["name","type","target"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/monitors/{id}":{"patch":{"summary":"Update a monitor","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"componentId":{"type":["string","null"]},"type":{"type":"string","enum":["http","tcp","icmp","dns","tls","push","game","domain"]},"target":{"type":"string","maxLength":2048},"intervalSeconds":{"type":"integer","minimum":30,"maximum":604800},"timeoutMs":{"type":"integer","minimum":500,"maximum":60000},"degradedLatencyMs":{"type":["integer","null"],"exclusiveMinimum":0},"config":{"type":"object","properties":{"http":{"type":"object","properties":{"method":{"type":"string","enum":["GET","HEAD","POST"],"default":"GET"},"expectedStatus":{"type":"array","items":{"type":"integer"},"default":[200,201,202,203,204,301,302,304]},"headers":{"type":"object","additionalProperties":{"type":"string"},"default":{}},"body":{"type":["string","null"],"maxLength":10000},"bodyContains":{"type":["string","null"],"maxLength":500},"followRedirects":{"type":"boolean","default":true},"verifyTls":{"type":"boolean","default":true}}},"dns":{"type":"object","properties":{"recordType":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT","CAA","SOA"],"default":"A"},"expected":{"type":"array","items":{"type":"string","maxLength":500},"maxItems":50,"default":[]},"match":{"type":"string","enum":["anyOf","contains","equals"],"default":"anyOf"},"mismatch":{"type":"string","enum":["down","degraded"],"default":"down"},"resolver":{"type":["string","null"]}}},"icmp":{"type":"object","properties":{"count":{"type":"integer","minimum":1,"maximum":20,"default":5},"maxLossRatio":{"type":"number","minimum":0,"maximum":1,"default":0.5}}},"tls":{"type":"object","properties":{"minDaysValid":{"type":"integer","minimum":0,"default":0},"warnDays":{"type":"integer","minimum":0,"maximum":365,"default":14},"serverName":{"type":["string","null"]}}},"domain":{"type":"object","properties":{"warnDays":{"type":"integer","minimum":0,"maximum":365,"default":30},"downDays":{"type":"integer","minimum":0,"maximum":365,"default":0}}},"game":{"type":"object","properties":{"game":{"type":"string","pattern":"^[a-z0-9-]{1,40}$","default":"custom"},"protocol":{"type":"string","enum":["minecraft","bedrock","a2s","fivem","quake3","satisfactory","mumble","teamspeak3","tshock","palworld","gamespy1","gamespy2","gamespy3","ase","unreal2","doom3","quake2","battlefield"]},"queryPort":{"type":["integer","null"],"minimum":1,"maximum":65535},"tcpPort":{"type":["integer","null"],"minimum":1,"maximum":65535},"graceSeconds":{"type":"integer","minimum":0,"maximum":3600,"default":0},"minPlayers":{"type":["integer","null"],"minimum":1,"maximum":100000},"expectVersion":{"type":["string","null"],"minLength":1,"maxLength":64},"username":{"type":["string","null"],"maxLength":64},"password":{"type":["string","null"],"maxLength":256},"publicFields":{"type":"array","items":{"type":"string","enum":["players","map","version"]},"maxItems":3,"default":["players"]}},"required":["protocol"]},"push":{"type":"object","properties":{"graceSeconds":{"type":"integer","minimum":0,"maximum":86400}}}}},"probeIds":{"type":"array","items":{"type":"string"}},"quorum":{"type":"integer","minimum":1,"maximum":20},"traceOnFailure":{"type":"boolean"},"enabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Delete a monitor","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/probes":{"get":{"summary":"List probes","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Register a probe (token returned once)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"kind":{"type":"string","enum":["agent","cloudflare","external"],"default":"agent"},"region":{"type":"string","maxLength":64},"provider":{"type":["string","null"],"maxLength":64},"asn":{"type":["integer","null"],"exclusiveMinimum":0},"location":{"type":["object","null"],"properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"],"minLength":2,"maxLength":2},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["city","country","lat","lng"]},"public":{"type":"boolean","default":true},"enabled":{"type":"boolean","default":true}},"required":["name","region"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/probes/{id}/rotate-token":{"post":{"summary":"Rotate a probe token","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/probes/{id}":{"patch":{"summary":"Update a probe","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"kind":{"type":"string","enum":["agent","cloudflare","external"]},"region":{"type":"string","maxLength":64},"provider":{"type":["string","null"],"maxLength":64},"asn":{"type":["integer","null"],"exclusiveMinimum":0},"location":{"type":["object","null"],"properties":{"city":{"type":["string","null"]},"country":{"type":["string","null"],"minLength":2,"maxLength":2},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["city","country","lat","lng"]},"public":{"type":"boolean"},"enabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Delete a probe","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/org-settings":{"get":{"summary":"Org-level settings, and whether the caller may change them","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Change org-level settings (owners and admins in the admin)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"nameUpstreamProviders":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/upstream/catalog":{"get":{"summary":"List upstream providers with their sites and services","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/upstream/subscriptions":{"get":{"summary":"List upstream subscriptions with matched event counts","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Subscribe to a provider location (creates its component unless given)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","enum":["ovhcloud","hetzner","aws","gcp","azure","cloudflare","digitalocean","linode","scaleway","upcloud","vultr"]},"sites":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9][A-Za-z0-9-]*$"},"minItems":1,"maxItems":50},"racks":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9][A-Za-z0-9-]*$"},"maxItems":500,"default":[]},"services":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40},"maxItems":20,"default":[]},"componentId":{"type":["string","null"],"minLength":1},"enabled":{"type":"boolean","default":true}},"required":["provider","sites"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/upstream/subscriptions/{id}":{"patch":{"summary":"Update an upstream subscription","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sites":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9][A-Za-z0-9-]*$"},"minItems":1,"maxItems":50},"racks":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9][A-Za-z0-9-]*$"},"maxItems":500},"services":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40},"maxItems":20},"componentId":{"type":["string","null"],"minLength":1},"enabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Remove an upstream subscription (past events stay)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/upstream/status":{"get":{"summary":"Last upstream feed sync per provider","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/upstream/sync":{"post":{"summary":"Fetch the org's provider feeds now and match them","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/subscribers":{"get":{"summary":"List subscribers of a page","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Remove every subscriber of a page and its webhooks (no message is sent)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Add one email subscriber (a confirmation email unless `optInAttested`)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"componentIds":{"type":"array","items":{"type":"string"},"maxItems":200},"language":{"type":"string","enum":["en","ro"]},"optInAttested":{"type":"boolean","default":false},"allowPrivatePage":{"type":"boolean","default":false}},"required":["email"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/subscribers/{subscriberId}":{"delete":{"summary":"Remove a subscriber","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"subscriberId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/webhooks":{"post":{"summary":"Create a webhook (secret returned once)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string"}}},"required":["url"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"summary":"List webhooks of a page (secrets are never returned)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/webhooks/{webhookId}":{"delete":{"summary":"Delete a webhook","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"webhookId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/api-keys":{"get":{"summary":"List API keys","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create an API key (returned once)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"scopes":{"type":"array","items":{"type":"string","enum":["pages:read","pages:write","components:write","incidents:write","monitors:write","probes:write","subscribers:read","subscribers:write"]},"minItems":1}},"required":["name","scopes"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/api-keys/{id}":{"delete":{"summary":"Revoke an API key","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/billing":{"get":{"summary":"Plan, usage, limits and estimated monthly cost","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/billing/checkout":{"post":{"summary":"Start a Stripe Checkout for the paid plan, billed monthly or yearly (owners)","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/billing/portal":{"post":{"summary":"Open the Stripe billing portal (owners)","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/billing/settings":{"patch":{"summary":"Spend limit and white-label (owners)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"spendLimit":{"type":["integer","null"],"minimum":900,"maximum":10000000},"whiteLabel":{"type":"boolean"}},"required":["spendLimit","whiteLabel"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/domains":{"get":{"summary":"List a page's addresses and custom domains","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Add a custom domain (paid plan). `validation: \"cname\"` (default): the customer adds one CNAME record and Cloudflare validates the hostname and issues the certificate once it points here (for a hostname not serving traffic yet). `\"txt\"`: for a page live elsewhere, two TXT records validate it before the CNAME moves, so there is no downtime.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hostname":{"type":"string","minLength":1,"maxLength":253},"validation":{"type":"string","enum":["cname","txt"]}},"required":["hostname"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/domains/{hostname}/connect":{"get":{"summary":"Domain Connect for a custom domain: whether its DNS provider supports our template, and the signed URL that opens the provider’s consent screen with the records filled in (`applyUrl`); otherwise why not (`unavailable`). Only when Domain Connect is on.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"hostname","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/domains/{hostname}/refresh":{"post":{"summary":"Check a custom domain with Cloudflare now; a pending one is asked to validate again (after adding or fixing its records)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"hostname","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/domains/{hostname}/primary":{"post":{"summary":"Make a domain the page's canonical address","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"hostname","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/domains/{hostname}":{"delete":{"summary":"Remove a custom domain","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"hostname","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/access":{"get":{"summary":"Who can see a page: mode, allowed networks, passwords (pages:write)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Make a page public or private, replace its allowed networks or set its session length. Turning a page with subscribers private needs `subscribers: keep | remove` (else 409 `subscribers_decision` with the counts).","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["public","private"]},"networks":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","maxLength":64},"label":{"type":["string","null"],"maxLength":60}},"required":["cidr"]},"maxItems":50},"sessionHours":{"type":"integer"},"sso":{"type":["object","null"],"properties":{"connectionId":{"type":"string","minLength":1,"maxLength":64},"only":{"type":"boolean","default":false},"groups":{"type":"array","items":{"type":"string","minLength":1,"maxLength":256},"maxItems":50,"default":[]}},"required":["connectionId"]},"subscribers":{"type":"string","enum":["keep","remove"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/access/passwords":{"post":{"summary":"Add a password to a private page","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":60},"password":{"type":"string","minLength":10,"maxLength":256}},"required":["label","password"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/access/passwords/{passwordId}":{"delete":{"summary":"Remove a password (signs out visitors who used it)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"passwordId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/access/sign-out":{"post":{"summary":"Sign every password session of a page out","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/subscribers/counts":{"get":{"summary":"Subscribers by channel, and webhooks","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/sso/connections":{"get":{"summary":"Identity providers for private pages’ visitors","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Connect an identity provider (OIDC)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["google","entra","oidc"]},"name":{"type":"string","minLength":1,"maxLength":60},"issuer":{"type":["string","null"],"maxLength":512},"clientId":{"type":"string","minLength":1,"maxLength":256},"clientSecret":{"type":["string","null"],"minLength":1,"maxLength":1024},"tenantId":{"type":["string","null"],"pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"allowedDomains":{"type":"array","items":{"type":"string"},"maxItems":20,"default":[]},"requireScim":{"type":"boolean","default":false}},"required":["kind","name","clientId"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/sso/connections/{id}":{"patch":{"summary":"Update an identity provider","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["google","entra","oidc"]},"name":{"type":"string","minLength":1,"maxLength":60},"issuer":{"type":["string","null"],"maxLength":512},"clientId":{"type":"string","minLength":1,"maxLength":256},"clientSecret":{"type":["string","null"],"minLength":1,"maxLength":1024},"tenantId":{"type":["string","null"],"pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i"},"allowedDomains":{"type":"array","items":{"type":"string"},"maxItems":20,"default":[]},"requireScim":{"type":"boolean","default":false}},"required":["kind","name","clientId"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Remove an identity provider (ends its sessions)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/scim":{"get":{"summary":"SCIM endpoint, tokens and directory size","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/scim/tokens":{"post":{"summary":"Create a SCIM token (returned once)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80}},"required":["name"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/scim/tokens/{id}":{"delete":{"summary":"Revoke a SCIM token","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/emails":{"get":{"summary":"A page’s email settings, its languages and recent events to preview with, and whether the plan includes email branding","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Change a page’s email settings: logos (PNG, JPG, GIF or WebP; never SVG), button and link colour (at least 3:1 on the email background), header, footer note, button corners. Absent fields keep their value, null clears one. Paid plan (402 `plan_limit` otherwise). No custom HTML or CSS; the unsubscribe link and the product credit aren’t settings.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"logoUrl":{"type":["string","null"],"maxLength":2048},"logoDarkUrl":{"type":["string","null"],"maxLength":2048},"accent":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"accentDark":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"header":{"type":["string","null"],"enum":["logo-name","logo","name",null]},"footerNote":{"type":["string","null"],"maxLength":240},"buttons":{"type":["string","null"],"enum":["rounded","square",null]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/emails/preview":{"post":{"summary":"Render a subscriber email of the page as it would be sent (subject, preview line, HTML, plain text, sender and headers): the confirmation, an incident or maintenance update at a step, or a reminder, with sample content or one of the page’s events, in one of its languages. `style` previews unsaved settings.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["confirmation","incident","maintenance","reminder"],"default":"incident"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"eventId":{"type":["string","null"]},"language":{"type":"string","enum":["en","ro"]},"style":{"type":["object","null"],"properties":{"logoUrl":{"type":["string","null"],"maxLength":2048},"logoDarkUrl":{"type":["string","null"],"maxLength":2048},"accent":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"accentDark":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"header":{"type":["string","null"],"enum":["logo-name","logo","name",null]},"footerNote":{"type":["string","null"],"maxLength":240},"buttons":{"type":["string","null"],"enum":["rounded","square",null]}}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/emails/test":{"post":{"summary":"Send the previewed email to your own verified address, “[Test]” in the subject. Signed-in users only (API keys have no address); 5 a minute; not counted against the email quota.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["confirmation","incident","maintenance","reminder"],"default":"incident"},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"eventId":{"type":["string","null"]},"language":{"type":"string","enum":["en","ro"]},"style":{"type":["object","null"],"properties":{"logoUrl":{"type":["string","null"],"maxLength":2048},"logoDarkUrl":{"type":["string","null"],"maxLength":2048},"accent":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"accentDark":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"header":{"type":["string","null"],"enum":["logo-name","logo","name",null]},"footerNote":{"type":["string","null"],"maxLength":240},"buttons":{"type":["string","null"],"enum":["rounded","square",null]}}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/link-previews":{"get":{"summary":"A page’s link-preview settings (`og:image`), whether the plan includes a fixed picture, the banner the banner layout falls back to, and recent events to preview with","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Change a page’s link-preview settings: style (`quiet`, the default, `split`, `poster`, `banner`), background for every style (`theme`, `brand`, `light`, `dark`, `custom` with `backgroundColor`), brand colour (`accent`, hex), logo (light, dark, none), page name, the 90-day record, banner image, fixed picture. Settings saved in the earlier shape (`standard`, `minimal`, `brand`, `scheme`) are read as today’s. Pictures are PNG or JPEG on a public https address or a path on the status app. Absent fields keep their value, null clears one. A fixed picture needs the paid plan (402 `plan_limit` otherwise); it replaces only the page’s card. Each change gives the cards a new image address.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"preset":{"type":["string","null"],"enum":["quiet","split","poster","banner",null]},"background":{"type":["string","null"],"enum":["theme","brand","light","dark","custom",null]},"backgroundColor":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"accent":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"logo":{"type":["string","null"],"enum":["light","dark","none",null]},"showName":{"type":["boolean","null"]},"history":{"type":["boolean","null"]},"bannerUrl":{"type":["string","null"],"maxLength":2048},"imageUrl":{"type":["string","null"],"maxLength":2048}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/link-previews/preview":{"post":{"summary":"Draw one of the page’s link-preview cards (1200×630 PNG as a data URL): its page card, or an incident’s or a maintenance’s (the given event, else its latest, else sample content), in one of its languages. `style` previews unsaved settings. Unpublished and private pages preview too; private pages serve no card.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["page","incident","maintenance"],"default":"page"},"eventId":{"type":["string","null"]},"language":{"type":"string","enum":["en","ro"]},"style":{"type":["object","null"],"properties":{"preset":{"type":["string","null"],"enum":["quiet","split","poster","banner",null]},"background":{"type":["string","null"],"enum":["theme","brand","light","dark","custom",null]},"backgroundColor":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"accent":{"type":["string","null"],"pattern":"^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i"},"logo":{"type":["string","null"],"enum":["light","dark","none",null]},"showName":{"type":["boolean","null"]},"history":{"type":["boolean","null"]},"bannerUrl":{"type":["string","null"],"maxLength":2048},"imageUrl":{"type":["string","null"],"maxLength":2048}}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/onboarding":{"get":{"summary":"Onboarding state of the active organization","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/onboarding/page":{"post":{"summary":"Create the first status page","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$"},"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^\\/(?![/\\\\])[^\\s?#]*$"},{"type":"null"}]},"timezone":{"type":"string","default":"UTC"}},"required":["name","slug"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/onboarding/monitor":{"post":{"summary":"Create the first component with an HTTP check","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pageId":{"type":"string","minLength":1},"name":{"type":"string","minLength":1,"maxLength":120},"url":{"type":"string","maxLength":2048,"format":"uri"}},"required":["pageId","name","url"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/onboarding/complete":{"post":{"summary":"Finish or skip onboarding (owner only)","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/invite-requests":{"post":{"tags":["Public"],"summary":"Request an invite to the Upstreamr beta","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"company":{"type":"string","maxLength":120,"default":""},"segment":{"type":"string","enum":["hosting","network","saas","other"]},"providers":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9-]{1,32}$"},"maxItems":20,"default":[]},"otherProvider":{"type":"string","maxLength":120,"default":""},"note":{"type":"string","maxLength":2000,"default":""},"from":{"type":"string","enum":["hosting","network","saas","none"],"default":"none"},"turnstileToken":{"type":["string","null"],"maxLength":4096}},"required":["email","segment"]}}}},"responses":{"201":{"description":"Request stored","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}},"required":["data"]}}}},"400":{"description":"Human verification failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Invite requests are not enabled here","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Already requested with this address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many attempts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/invite-requests":{"get":{"summary":"Beta invite requests (Upstreamr team only)","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/invite-requests/{id}/approve":{"post":{"summary":"Approve a beta invite request: email a sign-up link and open sign-up for that address","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/invite-requests/{id}/decline":{"post":{"summary":"Decline a beta invite request (nothing is sent)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/monitors/{id}/rotate-push-token":{"post":{"summary":"Issue a new push URL for a push monitor (returned once; the old one stops working)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts":{"get":{"summary":"Alert settings: my email switch, recipients, channels and recent alerts (signed-in members)","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/me":{"patch":{"summary":"Switch my own alert emails on or off","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"boolean"}},"required":["email"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/channels":{"post":{"summary":"Add a Discord, Slack, Teams or signed webhook alert channel (paid plan; owners and admins)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":2048}},"required":["url"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/telegram":{"post":{"summary":"Connect a Telegram chat as an alert channel: a one-time t.me link for the bot (paid plan; owners and admins)","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/telegram/{code}":{"get":{"summary":"Whether a Telegram connect link was used (owners and admins)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"code","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/channels/{id}":{"patch":{"summary":"Pause or resume an alert channel","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Remove an alert channel","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/test":{"post":{"summary":"Send a test alert to every recipient and channel","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/history":{"get":{"summary":"Every alert of the last 30 days, newest first and cursor-paged: what it said, its status and each delivery (recipient or channel, outcome, attempt) and every replay. Filter by kind, subject (monitor, probe, notice), component, channel (`email` for alert emails), result and UTC days. Signed-in members.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["monitor.down","monitor.up","monitor.flapping","monitor.settled","monitor.expiring","probe.offline","probe.online","upstream.review","alerts.capped","alerts.test","incident.draft"]},"required":false,"name":"kind","in":"query"},{"schema":{"type":"string","maxLength":64},"required":false,"name":"subjectId","in":"query"},{"schema":{"type":"string","maxLength":64},"required":false,"name":"componentId","in":"query"},{"schema":{"type":"string","maxLength":64},"required":false,"name":"channelId","in":"query"},{"schema":{"type":"string","enum":["sent","failed","held","sending","errors"]},"required":false,"name":"result","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"required":false,"name":"to","in":"query"},{"schema":{"type":"string","maxLength":200},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/history/{id}/preview":{"post":{"summary":"A past alert as “Send again” would send it, for every channel type: the email (subject, preview line, HTML, text), the Discord, Slack, Teams and Telegram payloads and the webhook body and headers, from the senders’ own functions. Signed-in members.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/history/{id}/replay":{"post":{"summary":"Send a past alert again to every current recipient and channel, one channel, or your own verified address: “[Replay]” before the subject, a line saying when it was first sent, webhooks get `type: alert.replay`. Changes no status, uptime, incident, draft or flapping state and isn’t counted in the hourly alert cap; 10 replays and samples a minute per organization. Owners and admins.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["all"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["me"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["channel"]},"channelId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","channelId"]}]}},"required":["target"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/samples/preview":{"post":{"summary":"A sample of one kind of alert for every channel type, with details from one of your monitors, probes, components or providers (or made-up ones), rendered by the senders’ own functions. Signed-in members.","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sample":{"type":"string","enum":["monitor.down","monitor.up","monitor.flapping","monitor.settled","monitor.still-down","monitor.certificate-expiring","monitor.domain-expiring","probe.offline","probe.online","upstream.review","incident.draft","incident.published","alerts.capped","alerts.test"]}},"required":["sample"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/alerts/samples/send":{"post":{"summary":"Send a sample alert to one channel or your own verified address: “[Sample]” before the subject, webhooks get `type: alert.sample`. No side effects; not counted in the hourly alert cap; 10 replays and samples a minute per organization. Owners and admins.","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sample":{"type":"string","enum":["monitor.down","monitor.up","monitor.flapping","monitor.settled","monitor.still-down","monitor.certificate-expiring","monitor.domain-expiring","probe.offline","probe.online","upstream.review","incident.draft","incident.published","alerts.capped","alerts.test"]},"target":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["me"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["channel"]},"channelId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","channelId"]}]}},"required":["sample","target"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/incident-drafts":{"get":{"summary":"Draft incidents opened by monitors and inbound alerts (`?state=open|active|history|all`, `?eventId=`)","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/incident-drafts/{id}":{"get":{"summary":"A draft incident with its signals","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/incident-drafts/{id}/publish":{"post":{"summary":"Publish a draft as an incident (edited as you like; notifies subscribers as any incident; 409 if already published)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["incident","maintenance"]},"title":{"type":"string","minLength":1,"maxLength":200},"status":{"anyOf":[{"type":"string","enum":["investigating","identified","monitoring","resolved"]},{"type":"string","enum":["scheduled","in_progress","verifying","completed","cancelled"]}]},"impact":{"type":"string","enum":["none","minor","major","critical","maintenance"]},"message":{"type":"string","minLength":1,"maxLength":20000},"translations":{"type":"object","properties":{"en":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}},"ro":{"type":"object","properties":{"title":{"type":["string","null"],"maxLength":200},"message":{"type":["string","null"],"maxLength":20000},"source":{"type":"string","enum":["operator"]}}}},"description":"Per-language versions of the texts, e.g. { \"ro\": { … } }. Empty fields fall back to the original text."},"pageIds":{"type":"array","items":{"type":"string"}},"components":{"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string"},"status":{"type":"string","enum":["operational","degraded_performance","partial_outage","major_outage","under_maintenance"]}},"required":["componentId","status"]},"default":[]},"scheduledStart":{"type":["string","null"],"format":"date-time"},"scheduledEnd":{"type":["string","null"],"format":"date-time"},"autoTransition":{"type":"boolean","default":true},"notify":{"type":"boolean","default":true},"reminders":{"type":["array","null"],"items":{"type":"string","enum":["1w","48h","24h","1h"]},"maxItems":3,"description":"Maintenance only: up to three of 1w, 48h, 24h, 1h, each sent once per window; [] = none; null = each page's setting."},"reminder":{"type":["string","null"],"enum":["off","1h","24h","48h","1w",null],"description":"Deprecated: one reminder (off = none). Use reminders; it wins when both are set."},"fillPlaceholders":{"type":"boolean"},"templateId":{"type":["string","null"]}},"required":["kind","title","status","impact","message"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/incident-drafts/{id}/discard":{"post":{"summary":"Discard an open draft (kept in the history), or stop tracking a published incident’s signals","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/incident-drafts/{id}/resolve":{"post":{"summary":"Post the proposed “Resolved” update of a published incident whose signals recovered","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1,"maxLength":20000}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/incident-automation":{"get":{"summary":"Draft incident settings: monitor drafts, template, auto-publish, auto-resolve","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Change the draft incident settings","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"monitorDrafts":{"type":"boolean"},"templateId":{"type":["string","null"]},"autoPublish":{"type":"string","enum":["off","immediate","delayed"]},"autoPublishDelayMinutes":{"type":"integer","minimum":1,"maximum":120},"autoResolve":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/inbound-integrations":{"get":{"summary":"Inbound alert endpoints (Alertmanager, Grafana, generic JSON)","tags":["Management"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Add an inbound alert endpoint (its URL is returned once)","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"componentField":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_.-]{0,63}$","default":"component"},"mappings":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","minLength":1,"maxLength":200},"componentId":{"type":"string"}},"required":["value","componentId"]},"maxItems":100,"default":[]},"defaultComponentId":{"type":["string","null"]}},"required":["name"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/inbound-integrations/{id}":{"patch":{"summary":"Change an inbound endpoint’s component mapping, or pause it","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"componentField":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_.-]{0,63}$"},"mappings":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","minLength":1,"maxLength":200},"componentId":{"type":"string"}},"required":["value","componentId"]},"maxItems":100},"defaultComponentId":{"type":["string","null"]},"enabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Remove an inbound alert endpoint","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/inbound-integrations/{id}/rotate-token":{"post":{"summary":"Issue a new URL for an inbound endpoint (returned once; the old one stops working)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/subscribers/export":{"get":{"summary":"Export subscribers as JSON or CSV (Discord/Slack webhook URLs masked)","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["json","csv"],"default":"json"},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"Every subscriber of the page: channel, address, state, components, dates, source","content":{"application/json":{"schema":{"type":"object","properties":{"data":{}}}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/subscribers/import":{"post":{"summary":"Import email subscribers from a CSV (Statuspage, Better Stack, Instatus, ours, any CSV with an email column) or a pasted list. `dryRun: true` previews every row. New addresses get one confirmation email unless `optInAttested`; existing and unsubscribed addresses are skipped.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"csv":{"type":"string","minLength":1,"maxLength":2000000},"format":{"type":"string","enum":["auto","statuspage","betterstack","instatus","upstreamr","generic"],"default":"auto"},"columns":{"type":"object","properties":{"email":{"type":"string","maxLength":200},"components":{"type":"string","maxLength":200},"language":{"type":"string","maxLength":200}}},"optInAttested":{"type":"boolean","default":false},"allowPrivatePage":{"type":"boolean","default":false},"dryRun":{"type":"boolean","default":false}},"required":["csv"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/subscribers/imports":{"get":{"summary":"Imports and hand-added subscribers: who, when, opt-in attested","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/history/import":{"post":{"summary":"Import components, incidents and maintenances (with every update) from another provider’s public status page: OpenStatus, Atlassian Statuspage, Instatus, Better Stack, or any RSS/Atom feed. `dryRun: true` previews. Nobody is notified; running it again adds only what’s new. Organization owners and admins only.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":3,"maxLength":2048},"source":{"type":"string","enum":["auto","openstatus","statuspage","instatus","betterstack","hetrixtools","feed"],"default":"auto"},"useDescription":{"type":"boolean","default":false},"dryRun":{"type":"boolean","default":false}},"required":["url"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/monitors/import/hetrixtools":{"post":{"summary":"Import uptime monitors from HetrixTools with a HetrixTools v3 API key allowed to run GET Uptime Monitors: website → HTTP (with its keyword), ping → ping on your probe agents, service and SMTP → TCP, heartbeat → push. The key is used for this request only and never stored. `dryRun: true` (the default) previews; `pageId` also adds a component per monitor to that page, grouped by HetrixTools category. Organization owners and admins only.","tags":["Management"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","maxLength":512},"dryRun":{"type":"boolean","default":true},"monitorIds":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9]{32}$"},"maxItems":2000,"default":[]},"pageId":{"type":["string","null"]}},"required":["apiKey"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/history/imports":{"get":{"summary":"History imports into the page: who, when, from where, what was added","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/prefixes":{"get":{"summary":"List the announced prefixes shown on a page (a mirror shows its source page’s), with visibility and RPKI","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Add prefixes with their origin AS (bogons and routes longer than /24 or /48 are refused; at most 25 new ones are checked on RIPEstat at once, the rest within minutes by the cron's 5-minute catch-up). Prefixes already on the page are left as they are. Up to 100 per page. Self-declared: nothing verifies the AS. Rate-limited per organization.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prefixes":{"type":"array","items":{"type":"object","properties":{"prefix":{"type":"string","maxLength":64},"originAsn":{"anyOf":[{"type":"integer"},{"type":"string","maxLength":16}]}},"required":["prefix","originAsn"]},"minItems":1,"maxItems":100}},"required":["prefixes"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/prefixes/lookup":{"post":{"summary":"What an AS announces according to RIPEstat (the last two weeks), against the page: new, already on it, or not addable, and the page’s prefixes with that origin it no longer announces. Nothing is saved. Rate-limited per organization.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"asn":{"anyOf":[{"type":"integer"},{"type":"string","maxLength":16}]}},"required":["asn"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/admin/pages/{id}/prefixes/{prefixId}":{"patch":{"summary":"Change the origin AS a prefix is expected from (RPKI is checked again at once). Rate-limited per organization.","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"prefixId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"originAsn":{"anyOf":[{"type":"integer"},{"type":"string","maxLength":16}]}},"required":["originAsn"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Remove a prefix from a page","tags":["Management"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"prefixId","in":"path"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Data"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this API key, user or IP (`rate_limited`; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{}}