{"openapi":"3.1.0","info":{"title":"UpDog API","version":"1.0.0","summary":"Uptime monitoring for teams: monitors, alert channels and status pages.","description":"Every request is scoped to the organization the API key belongs to. Reads need the viewer role, writes need editor or higher. Create keys in the dashboard under Settings → API Keys. The same key works for the hosted MCP server at /mcp.","contact":{"name":"UpDog","url":"https://updog.watch/contact"}},"servers":[{"url":"https://app.updog.watch/api/v1"}],"security":[{"bearerAuth":[]},{"oauth2":["read","write"]}],"tags":[{"name":"Account","description":"Who am I, what can I do."},{"name":"Monitors","description":"Things being checked."},{"name":"Notifications","description":"Alert channels monitors send to."},{"name":"Status pages","description":"Public pages showing monitor status."}],"paths":{"/me":{"get":{"tags":["Account"],"summary":"Account, plan, limits and usage","description":"Use this first: `limits.monitors - usage.monitors` is how many monitors can still be created, `limits.minInterval` is the fastest allowed check.","operationId":"getAccount","x-role":"viewer","x-codeSample":"curl https://app.updog.watch/api/v1/me \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","responses":{"200":{"description":"Account","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"$ref":"#/components/schemas/Account"}]},"example":{"ok":true,"organization":{"id":12,"name":"Acme"},"user":{"id":3,"email":"ops@acme.dev"},"role":"owner","apiKeyId":9,"plan":{"key":"watchdog","label":"WatchDog","basePlan":"watchdog","trial":{"active":false,"endsAt":null,"daysLeft":0,"planKey":"bigdog","used":false}},"limits":{"monitors":50,"statusPages":5,"users":5,"minInterval":60,"sms":true},"usage":{"monitors":12,"statusPages":1,"users":3},"baseUrl":"https://app.updog.watch"}}}},"401":{"description":"Missing or invalid key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monitor-types":{"get":{"tags":["Monitors"],"summary":"Supported monitor types","description":"Each type with its required and optional fields.","operationId":"listMonitorTypes","x-role":"viewer","x-codeSample":"curl https://app.updog.watch/api/v1/monitor-types \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","responses":{"200":{"description":"Types","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"types":{"type":"array","items":{"$ref":"#/components/schemas/MonitorType"}}}}]},"example":{"ok":true,"types":[{"type":"http","label":"HTTP(S)","description":"Request a URL and expect an accepted status code (default 200-299).","required":["url"],"optional":["method","acceptedStatusCodes","headers","body","ignoreTls","expiryNotification","maxredirects"]},{"type":"keyword","label":"HTTP(S) keyword","description":"Request a URL and require (or forbid, with invertKeyword) a keyword in the response body.","required":["url","keyword"],"optional":["invertKeyword","method","acceptedStatusCodes","headers","body","ignoreTls"]}]}}}}}}},"/monitors":{"get":{"tags":["Monitors"],"summary":"List monitors","description":"All monitors in the organization with live status, last check and uptime. `status` filters on the computed status; `search` matches name, URL and hostname.","operationId":"listMonitors","x-role":"viewer","x-codeSample":"curl https://app.updog.watch/api/v1/monitors?status=down \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["all","up","down","pending","paused","maintenance"]},"description":"Only monitors in this state."},{"name":"search","in":"query","schema":{"type":"string"},"description":"Case-insensitive substring of name, URL or hostname."}],"responses":{"200":{"description":"Monitors","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"count":{"type":"integer"},"monitors":{"type":"array","items":{"$ref":"#/components/schemas/Monitor"}}}}]},"example":{"ok":true,"count":1,"monitors":[{"id":415,"name":"api.acme.dev","type":"http","description":null,"active":true,"interval":60,"retryInterval":60,"maxretries":2,"parentId":null,"notificationIds":[7],"tags":[],"dashboardUrl":"https://app.updog.watch/dashboard/415","url":"https://api.acme.dev/health","method":"GET","acceptedStatusCodes":["200-299"],"status":"up","lastCheck":{"status":"up","time":"2026-10-28 21:14:07","message":"200 - OK","ping":212},"uptime24h":100,"uptime30d":99.98,"avgPing24h":207}]}}}}}},"post":{"tags":["Monitors"],"summary":"Create a monitor","description":"Creates the monitor and runs the first check within seconds. Push monitors return `pushUrl`, the URL your job must call. If `notificationIds` is omitted the organization's default channels are attached.","operationId":"createMonitor","x-role":"editor","x-example-request":{"name":"api.acme.dev","type":"http","url":"https://api.acme.dev/health","interval":60,"maxretries":2,"notificationIds":[7]},"x-codeSample":"curl -X POST https://app.updog.watch/api/v1/monitors \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"api.acme.dev\",\n    \"type\": \"http\",\n    \"url\": \"https://api.acme.dev/health\",\n    \"interval\": 60,\n    \"maxretries\": 2,\n    \"notificationIds\": [\n      7\n    ]\n  }'","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorInput"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"monitor":{"$ref":"#/components/schemas/Monitor"}}}]},"example":{"ok":true,"monitor":{"id":415,"name":"api.acme.dev","type":"http","description":null,"active":true,"interval":60,"retryInterval":60,"maxretries":2,"parentId":null,"notificationIds":[7],"tags":[],"dashboardUrl":"https://app.updog.watch/dashboard/415","url":"https://api.acme.dev/health","method":"GET","acceptedStatusCodes":["200-299"],"status":"pending","lastCheck":null,"uptime24h":0,"uptime30d":0,"avgPing24h":null}}}}},"402":{"description":"Plan limit: PLAN_LIMIT_MONITORS, PLAN_MIN_INTERVAL, PLAN_MIN_RETRY_INTERVAL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"VALIDATION: missing or invalid fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monitors/{id}":{"get":{"tags":["Monitors"],"summary":"Get a monitor","operationId":"getMonitor","x-role":"viewer","x-codeSample":"curl https://app.updog.watch/api/v1/monitors/415 \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Monitor ID"}],"responses":{"200":{"description":"Monitor","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"monitor":{"$ref":"#/components/schemas/Monitor"}}}]},"example":{"ok":true,"monitor":{"id":415,"name":"api.acme.dev","type":"http","description":null,"active":true,"interval":60,"retryInterval":60,"maxretries":2,"parentId":null,"notificationIds":[7],"tags":[],"dashboardUrl":"https://app.updog.watch/dashboard/415","url":"https://api.acme.dev/health","method":"GET","acceptedStatusCodes":["200-299"],"status":"up","lastCheck":{"status":"up","time":"2026-10-28 21:14:07","message":"200 - OK","ping":212},"uptime24h":100,"uptime30d":99.98,"avgPing24h":207}}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Monitors"],"summary":"Update a monitor","description":"Partial update: send only the fields to change. The check restarts with the new settings. `active: false` pauses, `active: true` resumes.","operationId":"updateMonitor","x-role":"editor","x-example-request":{"interval":30,"maxretries":3,"notificationIds":[7,8]},"x-codeSample":"curl -X PATCH https://app.updog.watch/api/v1/monitors/415 \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"interval\": 30,\n    \"notificationIds\": [\n      7,\n      8\n    ]\n  }'","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Monitor ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorInput"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"monitor":{"$ref":"#/components/schemas/Monitor"}}}]},"example":{"ok":true,"monitor":{"id":415,"name":"api.acme.dev","type":"http","description":null,"active":true,"interval":30,"retryInterval":60,"maxretries":2,"parentId":null,"notificationIds":[7,8],"tags":[],"dashboardUrl":"https://app.updog.watch/dashboard/415","url":"https://api.acme.dev/health","method":"GET","acceptedStatusCodes":["200-299"],"status":"up","lastCheck":{"status":"up","time":"2026-10-28 21:14:07","message":"200 - OK","ping":212},"uptime24h":100,"uptime30d":99.98,"avgPing24h":207}}}}},"402":{"description":"Plan limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"VALIDATION","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Monitors"],"summary":"Delete a monitor","description":"Permanent. Deletes the monitor and all its history.","operationId":"deleteMonitor","x-role":"editor","x-codeSample":"curl -X DELETE https://app.updog.watch/api/v1/monitors/415 \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Monitor ID"}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"deleted":{"type":"integer"}}}]},"example":{"ok":true,"deleted":415}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/monitors/{id}/pause":{"post":{"tags":["Monitors"],"summary":"Pause a monitor","description":"Stops checks and alerts; history is kept. Use around deploys.","operationId":"pauseMonitor","x-role":"editor","x-codeSample":"curl -X POST https://app.updog.watch/api/v1/monitors/415/pause \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Monitor ID"}],"responses":{"200":{"description":"Paused","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"monitor":{"$ref":"#/components/schemas/Monitor"}}}]},"example":{"ok":true,"monitor":{"id":415,"name":"api.acme.dev","type":"http","description":null,"active":false,"interval":60,"retryInterval":60,"maxretries":2,"parentId":null,"notificationIds":[7],"tags":[],"dashboardUrl":"https://app.updog.watch/dashboard/415","url":"https://api.acme.dev/health","method":"GET","acceptedStatusCodes":["200-299"],"status":"paused","lastCheck":{"status":"up","time":"2026-10-28 21:14:07","message":"200 - OK","ping":212},"uptime24h":100,"uptime30d":99.98,"avgPing24h":207}}}}}}}},"/monitors/{id}/resume":{"post":{"tags":["Monitors"],"summary":"Resume a monitor","operationId":"resumeMonitor","x-role":"editor","x-codeSample":"curl -X POST https://app.updog.watch/api/v1/monitors/415/resume \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Monitor ID"}],"responses":{"200":{"description":"Resumed","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"monitor":{"$ref":"#/components/schemas/Monitor"}}}]},"example":{"ok":true,"monitor":{"id":415,"name":"api.acme.dev","type":"http","description":null,"active":true,"interval":60,"retryInterval":60,"maxretries":2,"parentId":null,"notificationIds":[7],"tags":[],"dashboardUrl":"https://app.updog.watch/dashboard/415","url":"https://api.acme.dev/health","method":"GET","acceptedStatusCodes":["200-299"],"status":"up","lastCheck":{"status":"up","time":"2026-10-28 21:14:07","message":"200 - OK","ping":212},"uptime24h":100,"uptime30d":99.98,"avgPing24h":207}}}}}}}},"/monitors/{id}/heartbeats":{"get":{"tags":["Monitors"],"summary":"Recent check results","description":"Newest first. `important=1` returns only state changes (went down, came back), which is the incident history.","operationId":"listHeartbeats","x-role":"viewer","x-codeSample":"curl https://app.updog.watch/api/v1/monitors/415/heartbeats?important=1&limit=10 \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Monitor ID"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20}},{"name":"important","in":"query","schema":{"type":"string","enum":["0","1"]},"description":"1 = only state changes."}],"responses":{"200":{"description":"Heartbeats","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"monitorId":{"type":"integer"},"heartbeats":{"type":"array","items":{"$ref":"#/components/schemas/Heartbeat"}}}}]},"example":{"ok":true,"monitorId":415,"heartbeats":[{"status":"up","time":"2026-10-28 02:18:40","message":"200 - OK","ping":198,"important":true,"duration":60},{"status":"down","time":"2026-10-28 02:14:07","message":"Request failed with status code 503","ping":null,"important":true,"duration":60}]}}}}}}},"/notifications":{"get":{"tags":["Notifications"],"summary":"List alert channels","description":"Also returns `shortcuts`: the simplified channel types POST accepts and the config each needs.","operationId":"listNotifications","x-role":"viewer","x-codeSample":"curl https://app.updog.watch/api/v1/notifications \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","responses":{"200":{"description":"Notifications","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"notifications":{"type":"array","items":{"$ref":"#/components/schemas/Notification"}},"shortcuts":{"type":"object","additionalProperties":{"type":"string"}}}}]},"example":{"ok":true,"notifications":[{"id":7,"name":"Ops Slack","type":"slack","isDefault":true,"active":true}],"shortcuts":{"email":"Email from UpDog's mail server (no SMTP setup). config: { to }","sms":"SMS from UpDog (paid plans). config: { phone } in E.164, e.g. +15551234567","slack":"Slack incoming webhook. config: { webhookUrl, channel? }","discord":"Discord webhook. config: { webhookUrl }","teams":"Microsoft Teams incoming webhook. config: { webhookUrl }","webhook":"Generic HTTP webhook, JSON POST. config: { url }","telegram":"Telegram bot. config: { botToken, chatId }","pagerduty":"PagerDuty Events API v2. config: { integrationKey }","ntfy":"ntfy topic. config: { topic, serverUrl? }"}}}}}}},"post":{"tags":["Notifications"],"summary":"Create an alert channel","description":"Use a shortcut `type` with a small `config` (see the Notification channels reference), or any raw UpDog provider type with its native fields. SMS needs a paid plan.","operationId":"createNotification","x-role":"editor","x-example-request":{"name":"Ops Slack","type":"slack","config":{"webhookUrl":"https://hooks.slack.com/services/T000/B000/XXXX","channel":"#ops"},"isDefault":true},"x-codeSample":"curl -X POST https://app.updog.watch/api/v1/notifications \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Ops Slack\",\n    \"type\": \"slack\",\n    \"config\": {\n      \"webhookUrl\": \"https://hooks.slack.com/services/T000/B000/XXXX\"\n    },\n    \"isDefault\": true\n  }'","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationInput"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"notification":{"$ref":"#/components/schemas/Notification"}}}]},"example":{"ok":true,"notification":{"id":7,"name":"Ops Slack","type":"slack","isDefault":true,"active":true}}}}},"402":{"description":"PLAN_FEATURE_REQUIRED (SMS on free plan)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"VALIDATION","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/notifications/{id}":{"delete":{"tags":["Notifications"],"summary":"Delete an alert channel","description":"Detaches it from every monitor first.","operationId":"deleteNotification","x-role":"editor","x-codeSample":"curl -X DELETE https://app.updog.watch/api/v1/notifications/7 \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Notification ID"}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"deleted":{"type":"integer"}}}]},"example":{"ok":true,"deleted":7}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/status-pages":{"get":{"tags":["Status pages"],"summary":"List status pages","operationId":"listStatusPages","x-role":"viewer","x-codeSample":"curl https://app.updog.watch/api/v1/status-pages \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","responses":{"200":{"description":"Status pages","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"statusPages":{"type":"array","items":{"$ref":"#/components/schemas/StatusPage"}}}}]},"example":{"ok":true,"statusPages":[{"id":3,"slug":"acme-status","title":"Acme Status","description":null,"published":true,"url":"https://app.updog.watch/status/acme-status","groups":[{"id":5,"name":"Services","monitorIds":[415,416]}]}]}}}}}},"post":{"tags":["Status pages"],"summary":"Create a status page","description":"Publishes immediately at `url`. Monitors are shown in one group named `groupName`. Logos, custom domains and more groups are edited in the dashboard.","operationId":"createStatusPage","x-role":"editor","x-example-request":{"title":"Acme Status","slug":"acme-status","monitorIds":[415,416],"groupName":"Services"},"x-codeSample":"curl -X POST https://app.updog.watch/api/v1/status-pages \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"title\": \"Acme Status\",\n    \"monitorIds\": [\n      415,\n      416\n    ]\n  }'","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageInput"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"statusPage":{"$ref":"#/components/schemas/StatusPage"}}}]},"example":{"ok":true,"statusPage":{"id":3,"slug":"acme-status","title":"Acme Status","description":null,"published":true,"url":"https://app.updog.watch/status/acme-status","groups":[{"id":5,"name":"Services","monitorIds":[415,416]}]}}}}},"402":{"description":"PLAN_LIMIT_STATUS_PAGES","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"SLUG_TAKEN","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"VALIDATION","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/status-pages/{idOrSlug}":{"delete":{"tags":["Status pages"],"summary":"Delete a status page","operationId":"deleteStatusPage","x-role":"editor","x-codeSample":"curl -X DELETE https://app.updog.watch/api/v1/status-pages/acme-status \\\n  -H \"Authorization: Bearer $UPDOG_API_KEY\"","parameters":[{"name":"idOrSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Numeric ID or slug"}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Ok"},{"type":"object","properties":{"deleted":{"type":"integer"},"slug":{"type":"string"}}}]},"example":{"ok":true,"deleted":3,"slug":"acme-status"}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Organization API key (uk<id>_<secret>) or OAuth 2.1 access token (uo_…). Also accepted as X-API-Key."},"oauth2":{"type":"oauth2","description":"OAuth 2.1 with PKCE and dynamic client registration; see /.well-known/oauth-authorization-server.","flows":{"authorizationCode":{"authorizationUrl":"https://app.updog.watch/oauth/authorize","tokenUrl":"https://app.updog.watch/oauth/token","refreshUrl":"https://app.updog.watch/oauth/token","scopes":{"read":"Read monitors, channels and status pages","write":"Create, change and delete them"}}}}},"schemas":{"Ok":{"type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"]},"Error":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"object","properties":{"code":{"type":"string","enum":["UNAUTHENTICATED","INVALID_TOKEN","KEY_DISABLED","KEY_EXPIRED","FORBIDDEN","NOT_A_MEMBER","NO_ORGANIZATION","NOT_FOUND","SLUG_TAKEN","VALIDATION","INVALID_JSON","PLAN_LIMIT_MONITORS","PLAN_MIN_INTERVAL","PLAN_MIN_RETRY_INTERVAL","PLAN_LIMIT_STATUS_PAGES","PLAN_FEATURE_REQUIRED","RATE_LIMITED","INTERNAL_ERROR"]},"message":{"type":"string"},"limit":{"type":"integer","description":"On PLAN_LIMIT_*: the plan's limit."},"minInterval":{"type":"integer","description":"On PLAN_MIN_*: the plan's floor in seconds."},"plan":{"type":"string","description":"Plan label."}},"required":["code","message"]}},"example":{"ok":false,"error":{"code":"PLAN_MIN_INTERVAL","message":"Plan minimum interval is 300s on Puppy. Upgrade at /pricing to check faster.","minInterval":300,"plan":"Puppy"}}},"Account":{"type":"object","properties":{"organization":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"}}},"user":{"type":"object","properties":{"id":{"type":"integer"},"email":{"type":"string"}}},"role":{"type":"string","enum":["viewer","editor","admin","owner"]},"apiKeyId":{"type":"integer"},"plan":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"basePlan":{"type":"string","description":"Paid plan or puppy; differs from key while a trial is active."},"trial":{"type":"object"}}},"limits":{"type":"object","properties":{"monitors":{"type":"integer"},"statusPages":{"type":"integer"},"users":{"type":"integer"},"minInterval":{"type":"integer"},"sms":{"type":"boolean"}}},"usage":{"type":"object","properties":{"monitors":{"type":"integer"},"statusPages":{"type":"integer"},"users":{"type":"integer"}}},"baseUrl":{"type":"string"}}},"MonitorType":{"type":"object","properties":{"type":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"required":{"type":"array","items":{"type":"string"}},"optional":{"type":"array","items":{"type":"string"}}}},"MonitorInput":{"type":"object","properties":{"name":{"type":"string","maxLength":150,"description":"Display name. Required on create."},"type":{"type":"string","enum":["http","keyword","json-query","port","ping","dns","push","group"],"default":"http","description":"Monitor type. See GET /monitor-types for what each needs."},"url":{"type":"string","format":"uri","description":"Absolute http(s) URL. Required for http, keyword, json-query."},"hostname":{"type":"string","description":"Host name or IP. Required for port, ping, dns."},"port":{"type":"integer","minimum":1,"maximum":65535,"description":"TCP port. Required for port."},"interval":{"type":"integer","minimum":20,"maximum":86400,"default":60,"description":"Seconds between checks. Floor is the plan's minInterval (Puppy 300, WatchDog 60, BigDog 30)."},"retryInterval":{"type":"integer","minimum":20,"maximum":86400,"description":"Seconds between retries after a failed check. Defaults to interval."},"maxretries":{"type":"integer","minimum":0,"maximum":100,"default":0,"description":"Failed checks tolerated before the monitor is marked down and alerts fire. 0 alerts on the first failure. Alias: maxRetries."},"resendInterval":{"type":"integer","minimum":0,"default":0,"description":"Re-send the down alert every N checks while still down (0 = once)."},"timeout":{"type":"integer","minimum":1,"maximum":3600,"description":"Request timeout in seconds. Default 80% of interval (ping: 10)."},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],"default":"GET"},"acceptedStatusCodes":{"type":"array","items":{"type":"string"},"default":["200-299"],"description":"Status codes or ranges counted as up, e.g. [\"200-299\", \"301\"]."},"headers":{"type":"string","description":"JSON object of request headers, as a string, e.g. \"{\\\"Authorization\\\": \\\"Bearer …\\\"}\"."},"body":{"type":"string","description":"Request body for POST/PUT/PATCH (sent as JSON)."},"keyword":{"type":"string","description":"Text that must appear in the response body. Required for keyword."},"invertKeyword":{"type":"boolean","default":false,"description":"Alert when the keyword IS present."},"jsonPath":{"type":"string","description":"JSONata expression evaluated against the JSON response, e.g. $.status. Required for json-query."},"jsonPathOperator":{"type":"string","enum":["==","!=",">",">=","<","<=","contains","not contains","starts with"],"default":"=="},"expectedValue":{"type":"string","description":"Value the expression result is compared with. Required for json-query."},"dnsResolveType":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT","SOA","SRV","CAA","PTR"],"default":"A"},"dnsResolveServer":{"type":"string","default":"1.1.1.1","description":"Resolver to query."},"ignoreTls":{"type":"boolean","default":false,"description":"Skip TLS certificate validation."},"expiryNotification":{"type":"boolean","default":false,"description":"Also alert before the TLS certificate expires."},"upsideDown":{"type":"boolean","default":false,"description":"Invert the result: a successful check counts as down."},"maxredirects":{"type":"integer","default":10},"description":{"type":"string","maxLength":1000},"parentId":{"type":["integer","null"],"description":"Group monitor to nest under (null to un-nest)."},"notificationIds":{"type":"array","items":{"type":"integer"},"description":"Alert channels to attach (replaces the current set). On create, defaults to the organization's default channels."},"active":{"type":"boolean","default":true,"description":"false creates the monitor paused (or pauses it on update)."}}},"Monitor":{"type":"object","description":"Type-specific fields (url, hostname, port, keyword, jsonPath, pushUrl, …) are present only when relevant.","properties":{"id":{"type":"integer"},"name":{"type":"string"},"type":{"type":"string"},"description":{"type":["string","null"]},"active":{"type":"boolean"},"interval":{"type":"integer"},"retryInterval":{"type":"integer"},"maxretries":{"type":"integer"},"parentId":{"type":["integer","null"]},"notificationIds":{"type":"array","items":{"type":"integer"}},"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":["string","null"]},"color":{"type":"string"}}}},"dashboardUrl":{"type":"string"},"url":{"type":"string"},"hostname":{"type":"string"},"port":{"type":"integer"},"method":{"type":"string"},"acceptedStatusCodes":{"type":"array","items":{"type":"string"}},"keyword":{"type":"string"},"invertKeyword":{"type":"boolean"},"jsonPath":{"type":"string"},"jsonPathOperator":{"type":"string"},"expectedValue":{"type":"string"},"dnsResolveType":{"type":"string"},"dnsResolveServer":{"type":"string"},"pushUrl":{"type":"string","description":"Push monitors only: call this URL from your job. Add &status=down&msg=… to report a failure."},"status":{"type":"string","enum":["up","down","pending","maintenance","paused","unknown"]},"lastCheck":{"type":["object","null"],"properties":{"status":{"type":"string"},"time":{"type":"string"},"message":{"type":"string"},"ping":{"type":["number","null"],"description":"Response time in ms"}}},"uptime24h":{"type":"number","description":"Percent"},"uptime30d":{"type":"number","description":"Percent"},"avgPing24h":{"type":["number","null"]}}},"Heartbeat":{"type":"object","properties":{"status":{"type":"string","enum":["up","down","pending","maintenance"]},"time":{"type":"string","description":"UTC, YYYY-MM-DD HH:mm:ss"},"message":{"type":"string"},"ping":{"type":["number","null"]},"important":{"type":"boolean","description":"True when the state changed with this check."},"duration":{"type":"integer","description":"Seconds since the previous check"}}},"Notification":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"type":{"type":"string","description":"Provider type, e.g. slack, smtpEnv (email), twilioEnv (SMS)"},"isDefault":{"type":"boolean"},"active":{"type":"boolean"}}},"NotificationInput":{"type":"object","required":["name","type"],"properties":{"name":{"type":"string","maxLength":150},"type":{"type":"string","description":"Shortcut (email, sms, slack, discord, teams, webhook, telegram, pagerduty, ntfy) or a raw provider type."},"config":{"type":"object","description":"Type-specific fields. Shortcuts: email {to}, sms {phone}, slack {webhookUrl, channel?}, discord {webhookUrl}, teams {webhookUrl}, webhook {url}, telegram {botToken, chatId}, pagerduty {integrationKey}, ntfy {topic, serverUrl?}."},"isDefault":{"type":"boolean","default":false,"description":"Attach to every new monitor by default."},"applyExisting":{"type":"boolean","default":false,"description":"Also attach to all existing monitors now."}}},"StatusPage":{"type":"object","properties":{"id":{"type":"integer"},"slug":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"published":{"type":"boolean"},"url":{"type":"string"},"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"monitorIds":{"type":"array","items":{"type":"integer"}}}}}}},"StatusPageInput":{"type":"object","required":["title"],"properties":{"title":{"type":"string","maxLength":150},"slug":{"type":"string","pattern":"^[a-z0-9-]{2,64}$","description":"Defaults to a slug derived from the title. Must be unique across UpDog."},"description":{"type":"string","maxLength":1000},"monitorIds":{"type":"array","items":{"type":"integer"}},"groupName":{"type":"string","default":"Services"}}}}},"x-monitorTypes":[{"type":"http","label":"HTTP(S)","description":"Request a URL and expect an accepted status code (default 200-299).","required":["url"],"optional":["method","acceptedStatusCodes","headers","body","ignoreTls","expiryNotification","maxredirects"]},{"type":"keyword","label":"HTTP(S) keyword","description":"Request a URL and require (or forbid, with invertKeyword) a keyword in the response body.","required":["url","keyword"],"optional":["invertKeyword","method","acceptedStatusCodes","headers","body","ignoreTls"]},{"type":"json-query","label":"HTTP(S) JSON query","description":"Request a JSON URL, evaluate a JSONata/JSONPath expression and compare it with expectedValue.","required":["url","jsonPath","expectedValue"],"optional":["jsonPathOperator","method","headers","body"]},{"type":"port","label":"TCP port","description":"Open a TCP connection to hostname:port.","required":["hostname","port"],"optional":[]},{"type":"ping","label":"Ping","description":"ICMP ping a hostname or IP.","required":["hostname"],"optional":[]},{"type":"dns","label":"DNS","description":"Resolve a hostname and optionally require a specific record value (use keyword/expectedValue via conditions in the UI).","required":["hostname"],"optional":["dnsResolveType","dnsResolveServer"]},{"type":"push","label":"Push / heartbeat (cron job)","description":"Passive monitor: your job calls the returned pushUrl on success; UpDog alerts when it goes quiet for longer than the interval.","required":[],"optional":[]},{"type":"group","label":"Group","description":"A folder that rolls up other monitors (set parentId on children). Groups do not count towards the monitor limit.","required":[],"optional":[]}],"x-notificationShortcuts":[{"type":"email","provider":"smtpEnv","description":"Email from UpDog's mail server (no SMTP setup). config: { to }","required":["to"]},{"type":"sms","provider":"twilioEnv","description":"SMS from UpDog (paid plans). config: { phone } in E.164, e.g. +15551234567","required":["phone"]},{"type":"slack","provider":"slack","description":"Slack incoming webhook. config: { webhookUrl, channel? }","required":["webhookUrl"]},{"type":"discord","provider":"discord","description":"Discord webhook. config: { webhookUrl }","required":["webhookUrl"]},{"type":"teams","provider":"teams","description":"Microsoft Teams incoming webhook. config: { webhookUrl }","required":["webhookUrl"]},{"type":"webhook","provider":"webhook","description":"Generic HTTP webhook, JSON POST. config: { url }","required":["url"]},{"type":"telegram","provider":"telegram","description":"Telegram bot. config: { botToken, chatId }","required":["botToken","chatId"]},{"type":"pagerduty","provider":"PagerDuty","description":"PagerDuty Events API v2. config: { integrationKey }","required":["integrationKey"]},{"type":"ntfy","provider":"ntfy","description":"ntfy topic. config: { topic, serverUrl? }","required":["topic"]}],"x-errorCodes":{"UNAUTHENTICATED":{"status":401,"description":"No Authorization header."},"INVALID_TOKEN":{"status":401,"description":"Malformed, unknown or wrong key."},"KEY_DISABLED":{"status":401,"description":"Key was disabled in Settings → API Keys."},"KEY_EXPIRED":{"status":401,"description":"Key passed its expiry date."},"FORBIDDEN":{"status":403,"description":"Key's role is too low for this action (writes need editor or higher)."},"NOT_A_MEMBER":{"status":403,"description":"The key's creator is no longer a member of the organization."},"NO_ORGANIZATION":{"status":403,"description":"Key is not attached to an organization."},"NOT_FOUND":{"status":404,"description":"No such resource in this organization, or no such route."},"SLUG_TAKEN":{"status":409,"description":"Status page slug already in use."},"VALIDATION":{"status":422,"description":"Invalid or missing fields; the message says which."},"INVALID_JSON":{"status":400,"description":"Request body is not valid JSON."},"PLAN_LIMIT_MONITORS":{"status":402,"description":"Organization is at its plan's monitor limit."},"PLAN_MIN_INTERVAL":{"status":402,"description":"interval is below the plan's minimum (minInterval in the error)."},"PLAN_MIN_RETRY_INTERVAL":{"status":402,"description":"retryInterval is below the plan's minimum."},"PLAN_LIMIT_STATUS_PAGES":{"status":402,"description":"Organization is at its plan's status page limit."},"PLAN_FEATURE_REQUIRED":{"status":402,"description":"Feature (e.g. SMS) is not included in the plan."},"RATE_LIMITED":{"status":429,"description":"More than 120 requests in a minute from this key."},"INTERNAL_ERROR":{"status":500,"description":"Unexpected server error."}},"x-rateLimit":{"perMinute":120,"scope":"per API key"},"x-mcp":{"url":"https://app.updog.watch/mcp","transport":"streamable-http","auth":"OAuth 2.1 (discoverable) or the same bearer key"}}