{"openapi":"3.1.0","info":{"title":"Supaboard Uptime — Uptime Monitoring API","description":"Headless, API-first uptime monitoring. Define monitors; we check your\nendpoints on schedule and alert you via webhook, email, Slack or Telegram\nwhen their state changes. HTTPS monitors also emit ssl.expiring alerts at\n30, 14 and 7 days before certificate expiry. No dashboard — curl, Postman\nor your own app is enough.\n\nAuth: subscribe on RapidAPI; requests are authenticated through RapidAPI\nproxy headers. Every error uses the same shape:\n`{ \"error\": { \"code\", \"message\" } }`. Rate limit: 60 requests/min.\n\nProduct page: https://supaboard.app/uptime — subscribe & get an API key:\nhttps://rapidapi.com/derdogant/api/supaboard-uptime3","version":"1.0.0"},"components":{"schemas":{"Monitor":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"url":{"type":"string"},"method":{"type":"string","enum":["GET","HEAD","POST"]},"interval_seconds":{"type":"integer"},"timeout_ms":{"type":"integer"},"confirm_fails":{"type":"integer"},"paused":{"type":"boolean"},"status":{"type":"string","enum":["unknown","up","down"]},"has_headers":{"type":"boolean"},"ssl_expires_at":{"type":["null","string"],"format":"date-time","description":"TLS certificate expiry for HTTPS monitors (null for HTTP or before first SSL probe)"},"ssl_days_remaining":{"type":["null","integer"],"description":"Whole days until ssl_expires_at (null when ssl_expires_at is null)"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Channel":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["webhook","email","slack","telegram"]},"config":{"type":"object","additionalProperties":true},"verified":{"type":"boolean"},"disabled":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"}}},"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"CheckResult":{"type":"object","properties":{"outcome":{"type":"string","enum":["up","bad_status","timeout","dns_error","conn_error","tls_error","blocked"]},"status_code":{"type":["null","integer"]},"latency_ms":{"type":["null","integer"],"description":"TTFB (ms)"},"error":{"type":["null","string"]}}}}},"paths":{"/v1/health":{"get":{"summary":"Service health","tags":["system"],"responses":{"200":{"description":"Default Response"}}}},"/v1/monitors":{"post":{"summary":"Create a monitor","tags":["monitors"],"description":"Plan limits are enforced: monitor count and minimum check interval. `headers` are stored encrypted and never returned in responses. `method` is case-insensitive and stored uppercase (GET/HEAD/POST).","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["url"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"url":{"type":"string","minLength":1,"maxLength":2048},"method":{"enum":["GET","HEAD","POST"]},"interval_seconds":{"type":"integer","minimum":60,"maximum":86400},"timeout_ms":{"type":"integer","minimum":1000,"maximum":30000},"confirm_fails":{"type":"integer","minimum":1,"maximum":10},"headers":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":1000}}}}}},"required":true},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Monitor"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"summary":"List monitors","tags":["monitors"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"monitors":{"type":"array","items":{"$ref":"#/components/schemas/Monitor"}}}}}}}}}},"/v1/monitors/{id}":{"get":{"summary":"Get a monitor","tags":["monitors"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Monitor"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"summary":"Update a monitor","tags":["monitors"],"description":"If url or interval changes, the next check is scheduled immediately. `method` is case-insensitive and stored uppercase.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"url":{"type":"string","minLength":1,"maxLength":2048},"method":{"enum":["GET","HEAD","POST"]},"interval_seconds":{"type":"integer","minimum":60,"maximum":86400},"timeout_ms":{"type":"integer","minimum":1000,"maximum":30000},"confirm_fails":{"type":"integer","minimum":1,"maximum":10},"headers":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","maxLength":1000}}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Monitor"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a monitor","tags":["monitors"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/monitors/{id}/pause":{"post":{"summary":"Pause a monitor","tags":["monitors"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Monitor"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/monitors/{id}/resume":{"post":{"summary":"Resume a monitor","tags":["monitors"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Monitor"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/monitors/{id}/test":{"post":{"summary":"Run a synchronous check now","tags":["monitors"],"description":"The result is not stored and does not affect history — use it to validate configuration.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckResult"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/monitors/{id}/history":{"get":{"summary":"Check history","tags":["monitors"],"description":"Latest check results up to the plan history limit (BASIC: 100, others: 1000).","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":1000},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/monitors/{id}/stats":{"get":{"summary":"Uptime statistics","tags":["monitors"],"description":"Uptime percentage, average TTFB and incident count for the selected period.","parameters":[{"schema":{"enum":["24h","7d","30d","90d"]},"in":"query","name":"period","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/monitors/{id}/incidents":{"get":{"summary":"List incidents","tags":["monitors"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/channels":{"post":{"summary":"Create an alert channel","tags":["channels"],"description":"webhook: config.url (secret is returned once in the create response) · slack: config.url (Incoming Webhook) · telegram: config.chat_id (send /start to the bot) · email: config.address (a verification email is sent from alerts@supaboard.app; channel stays verified:false until the link is clicked, then POST /channels/{id}/test to confirm).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"enum":["webhook","email","slack","telegram"]},"config":{"type":"object"}}}}},"required":true},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Channel"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"summary":"List channels","tags":["channels"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"channels":{"type":"array","items":{"$ref":"#/components/schemas/Channel"}}}}}}}}}},"/v1/channels/{id}":{"delete":{"summary":"Delete a channel","tags":["channels"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/channels/{id}/test":{"post":{"summary":"Send a test notification","tags":["channels"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"delivered":{"type":"boolean"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"servers":[{"url":"https://uptime.supaboard.app"}],"tags":[{"name":"monitors","description":"Monitor CRUD, on-demand tests, history and stats"},{"name":"channels","description":"Alert channels (webhook, email, slack, telegram)"},{"name":"system","description":"Health and meta"}]}