{"openapi":"3.1.0","info":{"title":"Happy Uptime API","version":"1.0.0","description":"REST API for Happy Uptime — uptime monitoring, incidents, status pages, alerts, and analytics. All endpoints return JSON. Paginated endpoints include a `meta` object.","contact":{"url":"https://happyuptime.com"}},"servers":[{"url":"https://happyuptime.com/api/v1"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Agent Bootstrap","description":"AI agent onboarding — create accounts and invite users without existing credentials"},{"name":"Project","description":"Project info, embed URLs, and badge snippets"},{"name":"Monitors","description":"Create, manage, and query uptime monitors"},{"name":"Incidents","description":"Create and manage incidents with status updates"},{"name":"Status Pages","description":"Branded status pages with components"},{"name":"Alerts","description":"Alert channels and routing rules"},{"name":"Analytics","description":"Uptime, latency, and SLA data"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"hu_api_key","description":"API key with `hu_` prefix. Send exactly `Authorization: Bearer hu_...`. `X-API-Key` is not supported. Create keys in Dashboard → Settings → API Keys."}},"schemas":{"Monitor":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"type":{"type":"string","enum":["http","ping","tcp","dns","keyword","heartbeat"]},"url":{"type":"string","format":"uri"},"method":{"default":"GET","type":"string","enum":["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"]},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"body":{"type":"string"},"interval_seconds":{"default":60,"type":"integer","minimum":30,"maximum":3600},"timeout_ms":{"default":30000,"type":"integer","minimum":1000,"maximum":60000},"regions":{"default":["us-east"],"type":"array","items":{"type":"string","enum":["us-east","us-west","eu-west","eu-central","ap-southeast","ap-northeast"]}},"assertions":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"operator":{"type":"string"},"value":{"type":"string"}},"required":["type","operator","value"],"additionalProperties":false}},"auth_type":{"type":"string","enum":["basic","bearer","header"]},"auth_config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"keyword":{"type":"string"},"keyword_type":{"default":"contains","type":"string","enum":["contains","not_contains","regex"]},"heartbeat_interval":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"heartbeat_grace":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ssl_check":{"default":false,"type":"boolean"},"domain_check":{"default":false,"type":"boolean"},"screenshot_on_failure":{"default":true,"type":"boolean"},"screenshot_compare":{"default":false,"type":"boolean"},"screenshot_threshold":{"default":0.05,"type":"number","minimum":0,"maximum":1},"retry_count":{"default":2,"type":"integer","minimum":0,"maximum":5},"tags":{"type":"array","items":{"type":"string","maxLength":50}}},"required":["name","type","method","interval_seconds","timeout_ms","regions","keyword_type","ssl_check","domain_check","screenshot_on_failure","screenshot_compare","screenshot_threshold","retry_count"],"additionalProperties":false},"MonitorUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"type":{"type":"string","enum":["http","ping","tcp","dns","keyword","heartbeat"]},"url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"method":{"type":"string","enum":["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"]},"headers":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},{"type":"null"}]},"body":{"anyOf":[{"type":"string"},{"type":"null"}]},"interval_seconds":{"type":"integer","minimum":30,"maximum":3600},"timeout_ms":{"type":"integer","minimum":1000,"maximum":60000},"regions":{"type":"array","items":{"type":"string","enum":["us-east","us-west","eu-west","eu-central","ap-southeast","ap-northeast"]}},"assertions":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"operator":{"type":"string"},"value":{"type":"string"}},"required":["type","operator","value"],"additionalProperties":false}},{"type":"null"}]},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}]},"keyword_type":{"type":"string","enum":["contains","not_contains","regex"]},"ssl_check":{"type":"boolean"},"domain_check":{"type":"boolean"},"screenshot_on_failure":{"type":"boolean"},"screenshot_compare":{"type":"boolean"},"retry_count":{"type":"integer","minimum":0,"maximum":5},"tags":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]}},"additionalProperties":false},"Incident":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"severity":{"default":"minor","type":"string","enum":["minor","major","critical"]},"status":{"default":"investigating","type":"string","enum":["investigating","identified","monitoring","resolved"]},"message":{"type":"string"},"monitor_ids":{"type":"array","items":{"type":"string"}}},"required":["title","severity","status"],"additionalProperties":false},"IncidentUpdate":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"severity":{"type":"string","enum":["minor","major","critical"]},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]}},"additionalProperties":false},"IncidentStatusUpdate":{"type":"object","properties":{"message":{"type":"string","minLength":1},"status":{"default":"investigating","type":"string","enum":["investigating","identified","monitoring","resolved"]},"is_internal":{"default":false,"type":"boolean"}},"required":["message","status","is_internal"],"additionalProperties":false},"StatusPage":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"slug":{"type":"string","minLength":1,"maxLength":50,"pattern":"^[a-z0-9-]+$"},"template":{"default":"minimal","type":"string","enum":["minimal","brand","terminal","modern","clean","developer"]},"brand_color":{"default":"#2563eb","type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"required":["name","slug","template","brand_color"],"additionalProperties":false},"StatusPageUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"logo_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"favicon_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"brand_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"custom_css":{"anyOf":[{"type":"string"},{"type":"null"}]},"template":{"type":"string","enum":["minimal","brand","terminal","modern","clean","developer"]},"seo_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}]},"is_published":{"type":"boolean"},"show_response_times":{"type":"boolean"},"show_uptime_percentage":{"type":"boolean"}},"additionalProperties":false},"StatusPageComponent":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"monitor_id":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name"],"additionalProperties":false},"AlertChannel":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"type":{"type":"string","enum":["slack","discord","webhook","telegram","email"]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"is_default":{"default":false,"type":"boolean"}},"required":["name","type","config","is_default"],"additionalProperties":false},"AlertRule":{"type":"object","properties":{"monitor_id":{"type":"string","minLength":1},"alert_channel_id":{"type":"string","minLength":1},"on_down":{"default":true,"type":"boolean"},"on_recovery":{"default":true,"type":"boolean"},"on_degraded":{"default":false,"type":"boolean"}},"required":["monitor_id","alert_channel_id","on_down","on_recovery","on_degraded"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Monitor not found"},"status":{"type":"integer","example":404}},"required":["code","message","status"]}},"required":["error"]},"PaginationMeta":{"type":"object","properties":{"page":{"type":"integer","example":1},"per_page":{"type":"integer","example":25},"total":{"type":"integer","example":42},"total_pages":{"type":"integer","example":2}},"required":["page","per_page","total","total_pages"]},"DeletedResponse":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]}}},"paths":{"/agent/bootstrap":{"post":{"tags":["Agent Bootstrap"],"summary":"Create account + API key from email","operationId":"agentBootstrap","security":[],"description":"Public endpoint for AI agents. Creates a user account, organization, project, and admin API key from just an email address. The API key works immediately. Returns a claim_url for the user to set their password. Rate-limited to 3 per IP per hour.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","description":"Customer's email address"},"name":{"type":"string","description":"Customer's name (optional)"}}}}}},"responses":{"201":{"description":"Account created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"api_key":{"type":"string","description":"Admin API key (hu_ prefix). Works immediately."},"organization_id":{"type":"string"},"user_id":{"type":"string"},"email":{"type":"string"},"claim_url":{"type":"string","description":"URL for user to set their password (72h expiry)"},"claim_expires_in":{"type":"string","example":"72h"},"dashboard_url":{"type":"string"},"message":{"type":"string"}}}}}}}},"409":{"description":"Email already registered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (3/hr per IP)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agent/invite":{"post":{"tags":["Agent Bootstrap"],"summary":"Invite user to project","operationId":"agentInvite","description":"Invite a user to the current project. If the email is not registered, a new account is created automatically and a claim_url is returned. Requires admin API key.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"name":{"type":"string"},"role":{"type":"string","enum":["admin","editor","viewer"],"default":"editor"}}}}}},"responses":{"200":{"description":"User invited","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"user_id":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"},"is_new_account":{"type":"boolean"},"claim_url":{"type":"string","description":"Only present if a new account was created"}}}}}}}},"409":{"description":"Already a member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/project":{"get":{"tags":["Project"],"summary":"Get project info, plan, and embed URLs","operationId":"getProject","description":"Returns the current project's ID, name, plan, plan limits, embed URLs, ready-to-paste snippets, and status pages. Use `status_pages[].public_url` or `embeds.links.status_page` as the canonical public status-page URL. Do not infer public routes from project slugs.","responses":{"200":{"description":"Project info with plan, limits, and embeds","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","description":"Project ID"},"name":{"type":"string"},"slug":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"plan":{"type":"string","enum":["free","pro","team","enterprise"],"description":"Current billing plan"},"limits":{"type":"object","description":"Plan-specific resource limits","properties":{"monitors":{"type":"integer","description":"Max monitors allowed"},"status_pages":{"type":"integer","description":"Max status pages allowed"},"custom_domains":{"type":"integer","description":"Max custom domains (0 = not available)"},"rate_limit":{"type":"integer","description":"API requests per minute"}}},"embeds":{"type":"object","properties":{"badges":{"type":"object","properties":{"uptime":{"type":"string","format":"uri","description":"Uptime badge SVG URL"},"status":{"type":"string","format":"uri","description":"Status badge SVG URL"},"response_time":{"type":"string","format":"uri","description":"Response time badge SVG URL"}}},"links":{"type":"object","description":"Canonical public links for the project's default status page","properties":{"status_page":{"type":["string","null"],"format":"uri","description":"Canonical public status page URL. Prefers a custom domain when configured."}}},"widgets":{"type":"object","properties":{"status_json":{"type":"string","format":"uri","description":"Status JSON endpoint (CORS-enabled)"},"badge_iframe":{"type":"string","format":"uri"},"downtime_banner":{"type":"string","format":"uri","description":"Embeddable downtime banner JS"}}},"snippets":{"type":"object","description":"Ready-to-paste HTML and Markdown snippets. Badge snippets are pre-linked to the canonical public status page when one exists.","properties":{"uptime_badge_html":{"type":"string"},"status_badge_html":{"type":"string"},"status_badge_markdown":{"type":"string"},"uptime_badge_markdown":{"type":"string"},"downtime_banner_html":{"type":"string"},"status_json_fetch":{"type":"string"}}}}},"status_pages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"template":{"type":"string"},"brand_color":{"type":["string","null"]},"logo_url":{"type":["string","null"],"format":"uri"},"is_published":{"type":"integer","enum":[0,1]},"custom_domain":{"type":["string","null"]},"public_url":{"type":["string","null"],"format":"uri","description":"Canonical public URL for this status page when published. Uses the custom domain when configured, otherwise `/status/{slug}`."}}}}}}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monitors":{"get":{"tags":["Monitors"],"summary":"List monitors","operationId":"listMonitors","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","default":25}},{"name":"status","in":"query","schema":{"type":"string","enum":["unknown","up","down","degraded","paused"]}},{"name":"type","in":"query","schema":{"type":"string","enum":["http","ping","tcp","dns","keyword","heartbeat"]}},{"name":"tag","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of monitors","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Monitor"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Monitors"],"summary":"Create monitor","operationId":"createMonitor","x-required-scope":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Monitor"}}}},"responses":{"201":{"description":"Monitor created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Monitor"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monitors/bulk":{"post":{"tags":["Monitors"],"summary":"Bulk create monitors","operationId":"bulkCreateMonitors","description":"Create up to 50 monitors in a single request. Returns created monitors and per-item errors.","x-required-scope":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["monitors"],"properties":{"monitors":{"type":"array","maxItems":50,"items":{"$ref":"#/components/schemas/Monitor"}}}}}}},"responses":{"201":{"description":"Monitors created","content":{"application/json":{"schema":{"type":"object","properties":{"monitors":{"type":"array","items":{"$ref":"#/components/schemas/Monitor"}},"errors":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"error":{"type":"string"}}}}}}}}}}}},"/monitors/{id}":{"get":{"tags":["Monitors"],"summary":"Get monitor","operationId":"getMonitor","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Monitor detail with uptime","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Monitor"}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"tags":["Monitors"],"summary":"Update monitor","operationId":"updateMonitor","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorUpdate"}}}},"responses":{"200":{"description":"Monitor updated","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Monitor"}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Monitors"],"summary":"Delete monitor","operationId":"deleteMonitor","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Monitor deleted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DeletedResponse"}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monitors/{id}/pause":{"post":{"tags":["Monitors"],"summary":"Pause monitor","operationId":"pauseMonitor","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Monitor paused","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Monitor"}}}}}}}}},"/monitors/{id}/resume":{"post":{"tags":["Monitors"],"summary":"Resume monitor","operationId":"resumeMonitor","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Monitor resumed","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Monitor"}}}}}}}}},"/monitors/{id}/checks":{"get":{"tags":["Monitors"],"summary":"Check results","operationId":"listCheckResults","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","default":25}}],"responses":{"200":{"description":"Paginated check results"}}}},"/monitors/{id}/uptime":{"get":{"tags":["Monitors"],"summary":"Uptime data","operationId":"getMonitorUptime","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"period","in":"query","schema":{"type":"string","enum":["24h","7d","30d","90d"],"default":"30d"}}],"responses":{"200":{"description":"Daily uptime data"}}}},"/incidents":{"get":{"tags":["Incidents"],"summary":"List incidents","operationId":"listIncidents","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","default":25}},{"name":"status","in":"query","schema":{"type":"string","enum":["investigating","identified","monitoring","resolved"]}},{"name":"severity","in":"query","schema":{"type":"string","enum":["minor","major","critical"]}}],"responses":{"200":{"description":"Paginated list of incidents","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Incident"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}}},"post":{"tags":["Incidents"],"summary":"Create incident","operationId":"createIncident","x-required-scope":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Incident"}}}},"responses":{"201":{"description":"Incident created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Incident"}}}}}}}}},"/incidents/{id}":{"get":{"tags":["Incidents"],"summary":"Get incident","operationId":"getIncident","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Incident with updates and affected monitors"}}},"put":{"tags":["Incidents"],"summary":"Update incident","operationId":"updateIncident","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentUpdate"}}}},"responses":{"200":{"description":"Incident updated"}}},"delete":{"tags":["Incidents"],"summary":"Delete incident","operationId":"deleteIncident","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Incident deleted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DeletedResponse"}}}}}}}}},"/incidents/{id}/updates":{"post":{"tags":["Incidents"],"summary":"Add status update","operationId":"addIncidentUpdate","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentStatusUpdate"}}}},"responses":{"201":{"description":"Update added"}}}},"/incidents/{id}/resolve":{"post":{"tags":["Incidents"],"summary":"Resolve incident","operationId":"resolveIncident","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Incident resolved"}}}},"/status-pages":{"get":{"tags":["Status Pages"],"summary":"List pages","operationId":"listStatusPages","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"per_page","in":"query","schema":{"type":"integer","default":25}}],"responses":{"200":{"description":"Paginated list of status pages"}}},"post":{"tags":["Status Pages"],"summary":"Create page","operationId":"createStatusPage","x-required-scope":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPage"}}}},"responses":{"201":{"description":"Status page created"},"409":{"description":"Slug conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/status-pages/{id}":{"get":{"tags":["Status Pages"],"summary":"Get page","operationId":"getStatusPage","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Status page with components"}}},"put":{"tags":["Status Pages"],"summary":"Update page","operationId":"updateStatusPage","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageUpdate"}}}},"responses":{"200":{"description":"Status page updated"}}},"delete":{"tags":["Status Pages"],"summary":"Delete page","operationId":"deleteStatusPage","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Status page deleted"}}}},"/status-pages/{id}/components":{"post":{"tags":["Status Pages"],"summary":"Add component","operationId":"addComponent","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageComponent"}}}},"responses":{"201":{"description":"Component added"}}}},"/status-pages/{id}/components/{cid}":{"delete":{"tags":["Status Pages"],"summary":"Delete component","operationId":"deleteComponent","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"cid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Component deleted"}}}},"/status-pages/{id}/components/bulk":{"post":{"tags":["Status Pages"],"summary":"Bulk add components","operationId":"bulkAddComponents","description":"Add up to 50 components to a status page in a single request.","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["components"],"properties":{"components":{"type":"array","maxItems":50,"items":{"$ref":"#/components/schemas/StatusPageComponent"}}}}}}},"responses":{"201":{"description":"Components added","content":{"application/json":{"schema":{"type":"object","properties":{"components":{"type":"array","items":{"$ref":"#/components/schemas/StatusPageComponent"}},"errors":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"error":{"type":"string"}}}}}}}}}}}},"/status-pages/{id}/groups":{"get":{"tags":["Status Pages"],"summary":"List component groups","operationId":"listComponentGroups","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of component groups","content":{"application/json":{"schema":{"type":"object","properties":{"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"display_order":{"type":"integer"},"is_collapsed":{"type":"boolean"}}}}}}}}}}},"post":{"tags":["Status Pages"],"summary":"Create component group","operationId":"createComponentGroup","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"is_collapsed":{"type":"boolean","default":false}}}}}},"responses":{"201":{"description":"Group created"}}}},"/status-pages/{id}/groups/{gid}":{"put":{"tags":["Status Pages"],"summary":"Update component group","operationId":"updateComponentGroup","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"gid","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"display_order":{"type":"integer"},"is_collapsed":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Group updated"}}},"delete":{"tags":["Status Pages"],"summary":"Delete component group","operationId":"deleteComponentGroup","description":"Deletes the group and unlinks all components from it (components are NOT deleted).","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"gid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Group deleted"}}}},"/status-pages/{id}/custom-domain/analyze":{"post":{"tags":["Status Pages"],"summary":"Analyze custom domain DNS","operationId":"analyzeCustomDomain","x-required-scope":"write","description":"Inspects DNS records, Cloudflare ownership, and SSL status for a custom domain. Returns analysis with CNAME target, verification status, and setup instructions. Requires a paid plan.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","description":"Custom domain hostname (e.g. status.yourdomain.com)"}},"required":["domain"]}}}},"responses":{"200":{"description":"DNS analysis result"},"403":{"description":"Plan upgrade required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/status-pages/{id}/custom-domain/apply":{"post":{"tags":["Status Pages"],"summary":"Connect custom domain","operationId":"applyCustomDomain","x-required-scope":"write","description":"Registers the custom hostname via Cloudflare for SaaS, provisions SSL, and saves the domain to the status page. User must point a CNAME to status-proxy.happyuptime.com. Requires a paid plan.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","description":"Custom domain hostname (e.g. status.yourdomain.com)"}},"required":["domain"]}}}},"responses":{"200":{"description":"Custom domain applied with SSL provisioning status"},"403":{"description":"Plan upgrade required"},"409":{"description":"Domain already in use or zone not found"}}}},"/status-pages/{id}/custom-domain/verify":{"post":{"tags":["Status Pages"],"summary":"Verify custom domain","operationId":"verifyCustomDomain","x-required-scope":"write","description":"Checks whether the CNAME record is live and SSL is active. Call after the user has configured their DNS. Requires a paid plan.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"}}}}}},"responses":{"200":{"description":"Verification result with verified boolean and analysis"},"403":{"description":"Plan upgrade required"}}}},"/status-pages/{id}/custom-domain":{"delete":{"tags":["Status Pages"],"summary":"Remove custom domain","operationId":"removeCustomDomain","x-required-scope":"write","description":"Removes the custom domain from the status page and deletes the Cloudflare custom hostname.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Custom domain removed"},"400":{"description":"No custom domain connected"}}}},"/alerts/channels":{"get":{"tags":["Alerts"],"summary":"List channels","operationId":"listAlertChannels","responses":{"200":{"description":"List of alert channels"}}},"post":{"tags":["Alerts"],"summary":"Create channel","operationId":"createAlertChannel","x-required-scope":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertChannel"}}}},"responses":{"201":{"description":"Channel created"}}}},"/alerts/channels/{id}":{"delete":{"tags":["Alerts"],"summary":"Delete channel","operationId":"deleteAlertChannel","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Channel deleted"}}}},"/alerts/rules":{"get":{"tags":["Alerts"],"summary":"List rules","operationId":"listAlertRules","parameters":[{"name":"monitor_id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"List of alert rules"}}},"post":{"tags":["Alerts"],"summary":"Create rule","operationId":"createAlertRule","x-required-scope":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRule"}}}},"responses":{"201":{"description":"Rule created"}}}},"/alerts/rules/{id}":{"delete":{"tags":["Alerts"],"summary":"Delete rule","operationId":"deleteAlertRule","x-required-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Rule deleted"}}}},"/analytics/uptime":{"get":{"tags":["Analytics"],"summary":"Uptime data","operationId":"getUptime","parameters":[{"name":"monitor_id","in":"query","required":true,"schema":{"type":"string"}},{"name":"period","in":"query","schema":{"type":"string","enum":["24h","7d","30d","90d"],"default":"30d"}}],"responses":{"200":{"description":"Daily uptime with overall percentage"}}}},"/analytics/latency":{"get":{"tags":["Analytics"],"summary":"Latency data","operationId":"getLatency","parameters":[{"name":"monitor_id","in":"query","required":true,"schema":{"type":"string"}},{"name":"region","in":"query","schema":{"type":"string","enum":["us-east","us-west","eu-west","eu-central","ap-southeast","ap-northeast"]}},{"name":"from","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Hourly latency percentiles"}}}},"/analytics/sla":{"get":{"tags":["Analytics"],"summary":"SLA compliance","operationId":"getSla","parameters":[{"name":"monitor_id","in":"query","required":true,"schema":{"type":"string"}},{"name":"target","in":"query","schema":{"type":"number","default":99.9}},{"name":"days","in":"query","schema":{"type":"integer","default":30}}],"responses":{"200":{"description":"SLA compliance data with error budget"}}}},"/analytics/summary":{"get":{"tags":["Analytics"],"summary":"Dashboard summary","operationId":"getSummary","responses":{"200":{"description":"Monitor and incident summary"}}}}}}