{"openapi":"3.1.0","info":{"title":"PingRobot API","version":"1.0.0","summary":"Manage PingRobot monitors, alert contacts, maintenance windows and status pages.","description":"Send your API key as `Authorization: Bearer pr_live_…` (create keys in Settings → API keys). Read-only keys can only make GET requests. Limit: 120 requests a minute per key. Full guide: https://pingrobot.io/docs/api","contact":{"name":"PingRobot","url":"https://pingrobot.io/contact","email":"hello@pingrobot.io"},"termsOfService":"https://pingrobot.io/terms"},"externalDocs":{"description":"API guide","url":"https://pingrobot.io/docs/api"},"servers":[{"url":"https://pingrobot.io/api/v1"}],"security":[{"apiKey":[]}],"tags":[{"name":"Account","description":"The plan, its limits and usage."},{"name":"Monitors","description":"Websites, APIs, keywords, TCP ports, DNS records and cron heartbeats."},{"name":"Alert contacts","description":"Where down and up alerts go: email, webhooks, Slack and Discord."},{"name":"Maintenance windows","description":"Planned pauses: no checks and no alerts while a window is active."},{"name":"Status pages","description":"Public status pages."},{"name":"Announcements","description":"Incidents, maintenance notices and notes on a status page, and its email subscribers."}],"paths":{"/account":{"get":{"tags":["Account"],"operationId":"getAccount","summary":"Plan, limits and usage","responses":{"200":{"description":"The account.","content":{"application/json":{"schema":{"type":"object","required":["email","plan","limits","usage","grace"],"properties":{"email":{"type":"string"},"plan":{"type":"string","enum":["free","pro","business"]},"limits":{"type":"object"},"usage":{"type":"object","required":["monitors","statusPages"],"properties":{"monitors":{"type":"integer"},"statusPages":{"type":"integer"}}},"grace":{"type":["object","null"]}}}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/monitors":{"get":{"tags":["Monitors"],"operationId":"listMonitors","summary":"List monitors","responses":{"200":{"description":"All monitors with status, the last 24 hours and 30-day uptime.","content":{"application/json":{"schema":{"type":"object","required":["monitors","summary","limits"],"properties":{"monitors":{"type":"array","items":{"$ref":"#/components/schemas/MonitorListItem"}},"summary":{"type":"object"},"limits":{"type":"object","required":["monitors","used"],"properties":{"monitors":{"type":"integer"},"used":{"type":"integer"}}}}}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"tags":["Monitors"],"operationId":"createMonitor","summary":"Create a monitor","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/MonitorInput"},{"required":["type"]}]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","required":["monitor"],"properties":{"monitor":{"$ref":"#/components/schemas/Monitor"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/monitors/test":{"post":{"tags":["Monitors"],"operationId":"testMonitor","summary":"Run one check without saving","description":"Send the same fields as for a new monitor. Limited to 10 tests a minute.","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/MonitorInput"},{"required":["type"]}]}}}},"responses":{"200":{"description":"The check result and the start of the response.","content":{"application/json":{"schema":{"type":"object","required":["ok","code","reason","ms","response"],"properties":{"ok":{"type":"boolean"},"code":{"type":"string"},"reason":{"type":["string","null"]},"ms":{"type":["integer","null"]},"response":{"type":["object","null"]}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/monitors/bulk":{"post":{"tags":["Monitors"],"operationId":"bulkMonitors","summary":"Pause, resume, delete or tag several monitors","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ids","action"],"properties":{"ids":{"type":"array","items":{"type":"integer"},"maxItems":250},"action":{"type":"string","enum":["pause","resume","delete","tag","untag"]},"tag":{"type":"string"}}}}}},"responses":{"200":{"description":"What changed.","content":{"application/json":{"schema":{"type":"object","required":["action","updated","skipped"],"properties":{"action":{"type":"string"},"updated":{"type":"integer"},"skipped":{"type":"array","items":{"type":"object","required":["id","reason"],"properties":{"id":{"type":"integer"},"reason":{"type":"string"}}}}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/monitors/export":{"get":{"tags":["Monitors"],"operationId":"exportMonitors","summary":"Export every monitor as CSV","responses":{"200":{"description":"A CSV file.","content":{"text/csv":{"schema":{"type":"string"}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}}},"/monitors/import":{"post":{"tags":["Monitors"],"operationId":"importMonitors","summary":"Create monitors from CSV (ours or another tool's export)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["csv"],"properties":{"csv":{"type":"string","description":"Up to 1 MB and 500 rows."},"dryRun":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Dry run, or nothing could be created.","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Monitors created.","content":{"application/json":{"schema":{"type":"object","required":["dryRun","created","errors","warnings","truncated"],"properties":{"dryRun":{"type":"boolean"},"created":{"type":"array","items":{"type":"object"}},"errors":{"type":"array","items":{"type":"object","required":["line","error"],"properties":{"line":{"type":"integer"},"error":{"type":"string"}}}},"warnings":{"type":"array","items":{"type":"object"}},"truncated":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/monitors/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The monitor's id."}],"get":{"tags":["Monitors"],"operationId":"getMonitor","summary":"Get a monitor with stats, chart and incidents","parameters":[{"name":"range","in":"query","schema":{"type":"string","enum":["24h","7d","30d","90d","1y"],"default":"24h"},"description":"Chart range. 90d and 1y need Pro."}],"responses":{"200":{"description":"The monitor.","content":{"application/json":{"schema":{"type":"object","required":["monitor","contactIds","stats","range","chart","incidents"],"properties":{"monitor":{"$ref":"#/components/schemas/Monitor"},"contactIds":{"type":"array","items":{"type":"integer"}},"stats":{"type":"object","required":["uptime24","uptime7","uptime30","avgMs24","lastCheckAt"],"properties":{"uptime24":{"type":["number","null"]},"uptime7":{"type":["number","null"]},"uptime30":{"type":["number","null"]},"avgMs24":{"type":["integer","null"]},"lastCheckAt":{"type":["integer","null"]}}},"range":{"type":"string"},"chart":{"type":"array","items":{"type":"object"}},"incidents":{"type":"array","items":{"type":"object","required":["id","startedAt","endedAt","reason","hasDetail","comments"],"properties":{"id":{"type":"integer"},"startedAt":{"type":"integer"},"endedAt":{"type":["integer","null"]},"reason":{"type":["string","null"]},"hasDetail":{"type":"boolean"},"comments":{"type":"integer"}}}}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"patch":{"tags":["Monitors"],"operationId":"updateMonitor","summary":"Change a monitor (only the fields sent); pause with active: false","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorInput"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"type":"object","required":["monitor"],"properties":{"monitor":{"$ref":"#/components/schemas/Monitor"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"},"delete":{"tags":["Monitors"],"operationId":"deleteMonitor","summary":"Delete a monitor and its history","responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/monitors/{id}/incidents/{incidentId}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The monitor's id."},{"name":"incidentId","in":"path","required":true,"schema":{"type":"integer"},"description":"The incident's id."}],"get":{"tags":["Monitors"],"operationId":"getIncident","summary":"An incident with what the failing check saw, and its comments","responses":{"200":{"description":"The incident.","content":{"application/json":{"schema":{"type":"object","required":["incident"],"properties":{"incident":{"$ref":"#/components/schemas/Incident"}}}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/monitors/{id}/incidents/{incidentId}/comments":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The monitor's id."},{"name":"incidentId","in":"path","required":true,"schema":{"type":"integer"},"description":"The incident's id."}],"post":{"tags":["Monitors"],"operationId":"addIncidentComment","summary":"Add a comment to an incident","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["body"],"properties":{"body":{"type":"string","maxLength":2000,"description":"Plain text, up to 2,000 characters."}}}}}},"responses":{"201":{"description":"Added.","content":{"application/json":{"schema":{"type":"object","required":["comment"],"properties":{"comment":{"$ref":"#/components/schemas/IncidentComment"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/monitors/{id}/incidents/{incidentId}/comments/{commentId}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The monitor's id."},{"name":"incidentId","in":"path","required":true,"schema":{"type":"integer"},"description":"The incident's id."},{"name":"commentId","in":"path","required":true,"schema":{"type":"integer"},"description":"The comment's id."}],"delete":{"tags":["Monitors"],"operationId":"deleteIncidentComment","summary":"Delete a comment","responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"401":{"$ref":"#/components/responses/E401"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/contacts":{"get":{"tags":["Alert contacts"],"operationId":"listContacts","summary":"List alert contacts","responses":{"200":{"description":"Contacts and the channels your plan includes.","content":{"application/json":{"schema":{"type":"object","required":["contacts","channels"],"properties":{"contacts":{"type":"array","items":{"$ref":"#/components/schemas/Contact"}},"channels":{"type":"array","items":{"type":"string"}}}}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"tags":["Alert contacts"],"operationId":"createContact","summary":"Add an alert contact","description":"Email contacts get a confirmation link and alert once confirmed. A new confirmed contact is added to all monitors.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactInput"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","required":["contact"],"properties":{"contact":{"$ref":"#/components/schemas/Contact"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/contacts/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The contact's id."}],"delete":{"tags":["Alert contacts"],"operationId":"deleteContact","summary":"Remove an alert contact","responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/contacts/{id}/test":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The contact's id."}],"post":{"tags":["Alert contacts"],"operationId":"testContact","summary":"Send a test alert","responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"},"502":{"$ref":"#/components/responses/E502"}},"x-scope":"write"}},"/maintenance":{"get":{"tags":["Maintenance windows"],"operationId":"listMaintenanceWindows","summary":"List maintenance windows","responses":{"200":{"description":"All windows.","content":{"application/json":{"schema":{"type":"object","required":["windows","max"],"properties":{"windows":{"type":"array","items":{"$ref":"#/components/schemas/Window"}},"max":{"type":"integer"}}}}}},"401":{"$ref":"#/components/responses/E401"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"tags":["Maintenance windows"],"operationId":"createMaintenanceWindow","summary":"Create a maintenance window","description":"While a window is active the monitors it covers aren't checked and send no alerts.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WindowInput"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","required":["window"],"properties":{"window":{"$ref":"#/components/schemas/Window"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/maintenance/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The window's id."}],"patch":{"tags":["Maintenance windows"],"operationId":"updateMaintenanceWindow","summary":"Replace a maintenance window's settings","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WindowInput"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"type":"object","required":["window"],"properties":{"window":{"$ref":"#/components/schemas/Window"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"},"delete":{"tags":["Maintenance windows"],"operationId":"deleteMaintenanceWindow","summary":"Delete a maintenance window","responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/status-pages":{"get":{"tags":["Status pages"],"operationId":"listStatusPages","summary":"List status pages","responses":{"200":{"description":"Your pages.","content":{"application/json":{"schema":{"type":"object","required":["pages"],"properties":{"pages":{"type":"array","items":{"$ref":"#/components/schemas/Page"}}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"tags":["Status pages"],"operationId":"createStatusPage","summary":"Create a status page","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PageInput"},{"required":["title","slug"]}]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","required":["page"],"properties":{"page":{"$ref":"#/components/schemas/Page"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"409":{"$ref":"#/components/responses/E409"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/status-pages/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The status page's id."}],"patch":{"tags":["Status pages"],"operationId":"updateStatusPage","summary":"Change a status page (only the fields sent)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageInput"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"type":"object","required":["page"],"properties":{"page":{"$ref":"#/components/schemas/Page"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"409":{"$ref":"#/components/responses/E409"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"},"delete":{"tags":["Status pages"],"operationId":"deleteStatusPage","summary":"Delete a status page","responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/status-pages/{id}/announcements":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The status page's id."}],"get":{"tags":["Announcements"],"operationId":"listAnnouncements","summary":"List a page's announcements","responses":{"200":{"description":"Announcements with their updates.","content":{"application/json":{"schema":{"type":"object","required":["announcements","subscribers","statuses"],"properties":{"announcements":{"type":"array","items":{"type":"object"}},"subscribers":{"type":"integer"},"statuses":{"type":"object"}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}},"post":{"tags":["Announcements"],"operationId":"createAnnouncement","summary":"Post an incident, maintenance notice or note","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementInput"}}}},"responses":{"201":{"description":"Posted.","content":{"application/json":{"schema":{"type":"object","required":["id","notifying"],"properties":{"id":{"type":"integer"},"notifying":{"type":"integer","description":"Subscribers being emailed."}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/status-pages/{id}/announcements/{aid}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The status page's id."},{"name":"aid","in":"path","required":true,"schema":{"type":"integer"},"description":"The announcement's id."}],"delete":{"tags":["Announcements"],"operationId":"deleteAnnouncement","summary":"Remove an announcement","responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/status-pages/{id}/announcements/{aid}/updates":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The status page's id."},{"name":"aid","in":"path","required":true,"schema":{"type":"integer"},"description":"The announcement's id."}],"post":{"tags":["Announcements"],"operationId":"addAnnouncementUpdate","summary":"Add an update (e.g. resolved)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInput"}}}},"responses":{"201":{"description":"Added.","content":{"application/json":{"schema":{"type":"object","required":["ok","notifying"],"properties":{"ok":{"type":"boolean"},"notifying":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/E400"},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"415":{"$ref":"#/components/responses/E415"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}},"/status-pages/{id}/subscribers":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The status page's id."}],"get":{"tags":["Announcements"],"operationId":"listSubscribers","summary":"List a page's email subscribers","responses":{"200":{"description":"Up to 1,000 subscribers.","content":{"application/json":{"schema":{"type":"object","required":["subscribers","max","enabled"],"properties":{"subscribers":{"type":"array","items":{"type":"object","required":["id","email","confirmed","createdAt"],"properties":{"id":{"type":"integer"},"email":{"type":"string"},"confirmed":{"type":"boolean"},"createdAt":{"type":"integer"}}}},"max":{"type":"integer"},"enabled":{"type":"boolean"}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}}}},"/status-pages/{id}/subscribers/{sid}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"The status page's id."},{"name":"sid","in":"path","required":true,"schema":{"type":"integer"},"description":"The subscriber's id."}],"delete":{"tags":["Announcements"],"operationId":"deleteSubscriber","summary":"Remove a subscriber","responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"401":{"$ref":"#/components/responses/E401"},"403":{"$ref":"#/components/responses/E403"},"404":{"$ref":"#/components/responses/E404"},"429":{"$ref":"#/components/responses/E429"}},"x-scope":"write"}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"pr_live_…","description":"An API key from Settings → API keys."}},"schemas":{"Monitor":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"type":{"type":"string","enum":["http","keyword","port","heartbeat","dns"]},"url":{"type":["string","null"]},"host":{"type":["string","null"]},"port":{"type":["integer","null"]},"keyword":{"type":["string","null"]},"keywordAbsent":{"type":"boolean"},"intervalMin":{"type":"number","description":"0.5 means every 30 seconds."},"tags":{"type":"array","items":{"type":"string"}},"timeoutS":{"type":"integer"},"active":{"type":"boolean"},"status":{"type":"string","enum":["pending","up","down","paused"]},"statusSince":{"type":["integer","null"],"description":"Unix time in seconds (UTC)."},"lastReason":{"type":["string","null"],"description":"Why the last check failed."},"heartbeatUrl":{"type":["string","null"],"description":"heartbeat: the URL your job calls (no API key needed)."},"lastPingAt":{"type":["integer","null"],"description":"Unix time in seconds (UTC)."},"createdAt":{"type":"integer","description":"Unix time in seconds (UTC)."},"httpMethod":{"type":"string"},"httpHeaders":{"type":"array","maxItems":10,"items":{"type":"object","additionalProperties":false,"required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"}}},"description":"Request headers, e.g. Authorization."},"httpAuth":{"type":["object","null"],"description":"The authentication type and, for basic, the username. The secret is never returned.","properties":{"type":{"type":"string","enum":["basic","bearer"]},"username":{"type":"string"}}},"httpBody":{"type":["string","null"]},"expectedCodes":{"type":["string","null"]},"jsonRules":{"type":"array","maxItems":10,"description":"http only: checks on the JSON response, e.g. $.status equals ok.","items":{"type":"object","additionalProperties":false,"required":["path","op"],"properties":{"path":{"type":"string","description":"JSON path from the root: $.status, $.data[0].id, $['key with spaces']."},"op":{"type":"string","enum":["equals","not_equals","contains","not_contains","greater_than","less_than","exists","not_exists","not_empty"]},"value":{"description":"The value to compare with (not used by exists, not_exists and not_empty)."}}}},"dnsType":{"type":["string","null"]},"dnsExpected":{"type":"array","items":{"type":"string"}},"slowMs":{"type":["integer","null"]},"expiryDays":{"type":["integer","null"]},"sslDays":{"type":["integer","null"]},"alertAfterMin":{"type":"integer"},"repeatMin":{"type":"integer"},"ssl":{"type":["object","null"],"properties":{"expiresAt":{"type":["integer","null"],"description":"Unix time in seconds (UTC)."},"issuer":{"type":["string","null"]},"source":{"type":["string","null"]},"coversHost":{"type":["boolean","null"]},"error":{"type":["string","null"]},"problem":{"type":["string","null"]},"checkedAt":{"type":["integer","null"],"description":"Unix time in seconds (UTC)."}}},"domain":{"type":["object","null"],"properties":{"name":{"type":["string","null"]},"expiresAt":{"type":["integer","null"],"description":"Unix time in seconds (UTC)."},"checkedAt":{"type":["integer","null"],"description":"Unix time in seconds (UTC)."}}}}},"MonitorListItem":{"allOf":[{"$ref":"#/components/schemas/Monitor"},{"type":"object","properties":{"bars":{"type":"array","items":{"type":"string","enum":["up","down","none"]},"description":"The last 24 hours in 48 half-hour bars: up, down (at least one failed check) or none (no checks)."},"lastMs":{"type":["integer","null"]},"lastCheckAt":{"type":["integer","null"],"description":"Unix time in seconds (UTC)."},"uptime30":{"type":["number","null"],"description":"Percent over 30 days."},"maintenance":{"type":"boolean","description":"An active maintenance window covers it."}}}]},"MonitorInput":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["http","keyword","port","heartbeat","dns"],"description":"What to check. http: a URL's status code (and optional JSON rules); keyword: text in the page; port: a TCP port; heartbeat: a URL your job calls; dns: a DNS record."},"name":{"type":"string","maxLength":80,"description":"Shown in alerts and on status pages. Defaults to the target."},"url":{"type":"string","format":"uri","description":"http and keyword: a public http(s) URL."},"host":{"type":"string","description":"port: host name or IP. dns: the domain to look up."},"port":{"type":"integer","minimum":1,"maximum":65535,"description":"port: TCP port (25 is not allowed; use 587 or 465)."},"keyword":{"type":"string","maxLength":200,"description":"keyword: text to find in the first 512 KB of the response."},"keywordAbsent":{"type":"boolean","description":"keyword: true means down when the text IS found."},"dnsType":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT","CAA"],"description":"dns: record type. Default A."},"dnsExpected":{"type":"array","items":{"type":"string","maxLength":255},"maxItems":10,"description":"dns: values that must be present in the answer."},"intervalMin":{"type":"number","enum":[0.5,1,5,10,15,30,60,120,360,720,1440],"description":"Minutes between checks: 0.5, 1, 5, 10, 15, 30, 60 (0.5 = every 30 seconds, Business; heartbeats: 5, 10, 15, 30, 60, 120, 360, 720, 1440). Free: 5 at the fastest, Pro: 1."},"timeoutS":{"type":"integer","minimum":3,"maximum":30,"description":"Request timeout in seconds. Default 15."},"httpMethod":{"type":"string","enum":["GET","HEAD","POST","PUT","PATCH","DELETE","OPTIONS"],"description":"http and keyword: request method. Default GET."},"httpHeaders":{"type":"array","maxItems":10,"items":{"type":"object","additionalProperties":false,"required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"}}},"description":"Request headers, e.g. Authorization."},"httpAuth":{"type":["object","null"],"description":"http and keyword: authentication sent as the Authorization header. {\"type\":\"basic\",\"username\",\"password\"} or {\"type\":\"bearer\",\"token\"}; null removes it. Leave the password or token out to keep the saved one. Never returned.","properties":{"type":{"type":"string","enum":["basic","bearer"]},"username":{"type":"string","maxLength":200},"password":{"type":"string","maxLength":500},"token":{"type":"string","maxLength":2000}},"required":["type"]},"httpBody":{"type":["string","null"],"maxLength":8192,"description":"Request body for methods other than GET and HEAD (8 KB at most)."},"expectedCodes":{"type":["string","null"],"description":"Status codes that count as up, e.g. \"200-299,301\". Default 2xx. Expecting a 3xx checks the redirect instead of following it."},"jsonRules":{"type":"array","maxItems":10,"description":"http only: checks on the JSON response, e.g. $.status equals ok.","items":{"type":"object","additionalProperties":false,"required":["path","op"],"properties":{"path":{"type":"string","description":"JSON path from the root: $.status, $.data[0].id, $['key with spaces']."},"op":{"type":"string","enum":["equals","not_equals","contains","not_contains","greater_than","less_than","exists","not_exists","not_empty"]},"value":{"description":"The value to compare with (not used by exists, not_exists and not_empty)."}}}},"slowMs":{"type":["integer","null"],"minimum":100,"maximum":30000,"description":"Down when the response is slower than this (ms)."},"sslDays":{"type":["integer","null"],"enum":[7,14,30,null],"description":"HTTPS monitors: certificate expiry reminder, days ahead. New HTTPS monitors default to 14."},"expiryDays":{"type":["integer","null"],"enum":[7,14,30,60,null],"description":"Domain expiry reminder, days ahead."},"alertAfterMin":{"type":"integer","enum":[0,2,5,10,15,30,60],"description":"Send the down alert only after this many minutes down. Default 0."},"repeatMin":{"type":"integer","enum":[0,15,30,60,120,360,1440],"description":"Repeat a 'still down' reminder every N minutes; 0 for never."},"tags":{"type":"array","maxItems":10,"items":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9 ._-]{0,29}$"},"description":"Labels to group monitors, e.g. by client or environment. Stored lowercase."},"contactIds":{"type":"array","items":{"type":"integer"},"description":"Alert contacts for this monitor. Left out on create: every confirmed contact. [] alerts nobody."},"active":{"type":"boolean","description":"false pauses the monitor; true resumes it."}}},"Contact":{"type":"object","properties":{"id":{"type":"integer"},"type":{"type":"string"},"target":{"type":"string"},"label":{"type":["string","null"]},"verified":{"type":"boolean","description":"Email contacts alert only once the address is confirmed."},"secret":{"type":"string","description":"Webhooks only: the signing secret (whsec_…)."}}},"ContactInput":{"type":"object","additionalProperties":false,"required":["type","target"],"properties":{"type":{"type":"string","enum":["email","webhook","slack","discord","ntfy"],"description":"Slack, Discord and ntfy are on Pro. ntfy: target is the topic URL, e.g. https://ntfy.sh/your-topic."},"target":{"type":"string","description":"Email address, or the https URL of the webhook / Slack / Discord incoming webhook."},"label":{"type":"string","maxLength":60}}},"Window":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"repeat":{"type":"string"},"monitorIds":{"type":["array","null"],"items":{"type":"integer"}},"startAt":{"type":["integer","null"],"description":"Unix time in seconds (UTC)."},"endAt":{"type":["integer","null"],"description":"Unix time in seconds (UTC)."},"timeMin":{"type":["integer","null"]},"durationMin":{"type":["integer","null"]},"days":{"type":["integer","null"]},"tz":{"type":"string"},"active":{"type":"boolean"},"expired":{"type":"boolean"}}},"WindowInput":{"type":"object","additionalProperties":false,"required":["repeat"],"properties":{"name":{"type":"string","maxLength":80},"repeat":{"type":"string","enum":["once","daily","weekly"]},"monitorIds":{"type":["array","null"],"items":{"type":"integer"},"description":"The monitors it covers; null for all."},"startAt":{"type":"integer","description":"once: start (unix seconds)."},"endAt":{"type":"integer","description":"once: end, at most 7 days after the start."},"timeMin":{"type":"integer","minimum":0,"maximum":1439,"description":"daily/weekly: start, minutes after midnight in tz."},"durationMin":{"type":"integer","minimum":5,"maximum":1440,"description":"daily/weekly: length in minutes."},"days":{"type":"integer","minimum":1,"maximum":127,"description":"weekly: weekday bitmask, Monday = 1, Tuesday = 2, Wednesday = 4 … Sunday = 64."},"tz":{"type":"string","description":"IANA time zone, e.g. Europe/Istanbul. Default UTC."}}},"Page":{"type":"object","properties":{"id":{"type":"integer"},"slug":{"type":"string"},"title":{"type":"string"},"brand":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"integer"}},"slaTarget":{"type":["number","null"]},"slaPeriod":{"type":"string"},"customDomain":{"type":["string","null"]},"customDomainLive":{"type":"boolean"},"noindex":{"type":"boolean"},"showUptime":{"type":"boolean"},"showIncidents":{"type":"boolean"},"passwordProtected":{"type":"boolean"},"subdomainUrl":{"type":["string","null"]}}},"PageInput":{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string","maxLength":80},"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{1,38}[a-z0-9])$","description":"The address: pingrobot.io/s/{slug} and {slug}.pingrobot.io."},"monitorIds":{"type":"array","items":{"type":"integer"},"maxItems":50},"brand":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"slaTarget":{"type":["number","null"],"description":"SLA target in percent, e.g. 99.9."},"slaPeriod":{"type":"string","enum":["month","30d"]},"noindex":{"type":"boolean","description":"Hide the page from search engines."},"showUptime":{"type":"boolean","description":"Show 90-day bars, uptime % and the SLA block. Default true."},"showIncidents":{"type":"boolean","description":"Show past incidents. Default true."},"password":{"type":["string","null"],"minLength":6,"maxLength":128,"description":"Pro: protect the page with a password. null or \"\" removes it. Never returned."}}},"AnnouncementInput":{"type":"object","additionalProperties":false,"required":["kind","status","title","body"],"properties":{"kind":{"type":"string","enum":["incident","maintenance","info"]},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved","scheduled","in_progress","completed","posted"],"description":"incident: investigating, identified, monitoring, resolved; maintenance: scheduled, in_progress, completed; info: posted."},"title":{"type":"string","maxLength":140},"body":{"type":"string","maxLength":5000},"notify":{"type":"boolean","description":"Pro: email the page's confirmed subscribers."}}},"UpdateInput":{"type":"object","additionalProperties":false,"required":["status","body"],"properties":{"status":{"type":"string","enum":["investigating","identified","monitoring","resolved","scheduled","in_progress","completed","posted"],"description":"incident: investigating, identified, monitoring, resolved; maintenance: scheduled, in_progress, completed; info: posted."},"body":{"type":"string","maxLength":5000},"notify":{"type":"boolean","description":"Pro: email the page's confirmed subscribers."}}},"Incident":{"type":"object","required":["id","monitorId","startedAt","endedAt","reason","detail","comments"],"properties":{"id":{"type":"integer"},"monitorId":{"type":"integer"},"startedAt":{"type":"integer"},"endedAt":{"type":["integer","null"]},"reason":{"type":["string","null"]},"detail":{"type":["object","null"],"description":"What the failing check saw (incidents from before October 2026 have none).","properties":{"at":{"type":"integer"},"target":{"type":["string","null"]},"ms":{"type":["integer","null"]},"code":{"type":["string","null"],"description":"HTTP status or a short token such as timeout, keyword, json, slow, refused, nxdomain."},"status":{"type":"integer","description":"HTTP status (HTTP monitors)."},"statusText":{"type":"string"},"url":{"type":"string","description":"Final URL after redirects."},"headers":{"type":"array","items":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":2},"description":"Response headers as [name, value]; cookies are not kept."},"body":{"type":"string","description":"The first 1 KB of the response body."},"error":{"type":"string","description":"Connection, TLS, DNS or timeout error."},"dns":{"type":"object","description":"DNS monitors: name, type, status and the answers."},"lastPingAt":{"type":["integer","null"],"description":"Heartbeats: the last ping before the miss."},"second":{"type":"object","description":"The confirming re-check: remote (from another region), ms, code, reason."}}},"comments":{"type":"array","items":{"type":"object","required":["id","author","body","createdAt"],"properties":{"id":{"type":"integer"},"author":{"type":"string","description":"Email of who wrote it."},"body":{"type":"string"},"createdAt":{"type":"integer"}}}}}},"IncidentComment":{"type":"object","required":["id","author","body","createdAt"],"properties":{"id":{"type":"integer"},"author":{"type":"string","description":"Email of who wrote it."},"body":{"type":"string"},"createdAt":{"type":"integer"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"upgrade":{"type":"boolean","description":"The limit or feature needs a higher plan."}}}},"responses":{"E400":{"description":"The request isn't valid; the message says which field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E401":{"description":"The key is missing, wrong or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E403":{"description":"Read-only key, or not on your plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E404":{"description":"Not found on your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E409":{"description":"Conflict, e.g. the status page address is taken.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E415":{"description":"The body isn't application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E429":{"description":"Over 120 requests a minute; wait Retry-After seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E502":{"description":"The test alert couldn't be delivered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}