{"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"]}}}},"parameters":{"RapidAPIHost":{"name":"X-RapidAPI-Host","in":"header","required":true,"schema":{"type":"string","default":"{{RapidAPIHost}}","example":"{{RapidAPIHost}}"},"description":"RapidAPI host header (gateway routing)","example":"{{RapidAPIHost}}"},"RapidAPIKey":{"name":"X-RapidAPI-Key","in":"header","required":true,"schema":{"type":"string","default":"{{RapidAPIKey}}","example":"{{RapidAPIKey}}"},"description":"RapidAPI subscription key","example":"{{RapidAPIKey}}"}}},"paths":{"/v1/health":{"get":{"summary":"Service health","tags":["system"],"responses":{"200":{"description":"Default Response"}},"parameters":[{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}]}},"/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}}}},"example":{"name":"api.example.com health","url":"https://api.example.com/health","method":"GET|HEAD|POST","interval_seconds":300,"timeout_ms":10000,"confirm_fails":2,"headers":{"Authorization":"Bearer YOUR_TOKEN"}}}},"required":true},"responses":{"201":{"description":"Default Response"},"403":{"description":"Default Response"},"422":{"description":"Default Response"}},"parameters":[{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}]},"get":{"summary":"List monitors","tags":["monitors"],"responses":{"200":{"description":"Default Response"}},"parameters":[{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}]}},"/v1/monitors/{id}":{"get":{"summary":"Get a monitor","tags":["monitors"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"responses":{"200":{"description":"Default Response"},"404":{"description":"Default Response"}}},"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}}}},"example":{"name":"api.example.com health","url":"https://api.example.com/health","method":"GET|HEAD|POST","interval_seconds":300,"timeout_ms":10000,"confirm_fails":2,"headers":{"Authorization":"Bearer YOUR_TOKEN"}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"responses":{"200":{"description":"Default Response"},"404":{"description":"Default Response"},"422":{"description":"Default Response"}}},"delete":{"summary":"Delete a monitor","tags":["monitors"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"responses":{"404":{"description":"Default Response"}}}},"/v1/monitors/{id}/pause":{"post":{"summary":"Pause a monitor","tags":["monitors"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"responses":{"200":{"description":"Default Response"},"404":{"description":"Default Response"}}}},"/v1/monitors/{id}/resume":{"post":{"summary":"Resume a monitor","tags":["monitors"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"responses":{"200":{"description":"Default Response"},"404":{"description":"Default Response"}}}},"/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},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"responses":{"200":{"description":"Default Response"},"404":{"description":"Default Response"}}}},"/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},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"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,"example":"24h|7d|30d|90d"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"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},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"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"}}},"example":{"type":"webhook|email|slack|telegram","config":{"url":"https://example.com/alerts","address":"you@example.com","chat_id":"123456789"}}}},"required":true},"responses":{"201":{"description":"Default Response"},"403":{"description":"Default Response"},"409":{"description":"Default Response"},"422":{"description":"Default Response"},"502":{"description":"Default Response"}},"parameters":[{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}]},"get":{"summary":"List channels","tags":["channels"],"responses":{"200":{"description":"Default Response"}},"parameters":[{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}]}},"/v1/channels/{id}":{"delete":{"summary":"Delete a channel","tags":["channels"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"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},{"$ref":"#/components/parameters/RapidAPIHost"},{"$ref":"#/components/parameters/RapidAPIKey"}],"responses":{"200":{"description":"Default Response"},"404":{"description":"Default Response"},"409":{"description":"Default Response"},"502":{"description":"Default Response"}}}}},"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"}],"security":[]}