{"openapi":"3.1.0","info":{"title":"Oh Dear (BYOK) API","version":"0.1.0","description":"Oh Dear (BYOK) lets an AI assistant read your own Oh Dear data through the Oh Dear API with a key you supply (Oh Dear API token). Read-only: 11 tools (get_me, list_monitors, get_monitor, get_uptime, list_downtime, get_check_summary, get_certificate_health, list_broken_links, list_cron_checks, list_status_pages, list_maintenance_periods). The BYOK key travels with each request, is used for that...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-ohdear.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-ohdear/docs"},"termsOfService":"https://connectorbay.com/byok-ohdear/terms"},"servers":[{"url":"https://byok-ohdear.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-ohdear/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/get_me":{"post":{"operationId":"get_me","summary":"Show the Oh Dear user the token belongs to: id and name. Use for \"Which Oh Dear account is my token for\".","description":"Show the Oh Dear user the token belongs to: id and name. Use for \"Which Oh Dear account is my token for\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_meArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_monitors":{"post":{"operationId":"list_monitors","summary":"List monitors (http, ping, tcp, ai) with URL, label, group, tags and the summarized result of the latest checks (pending","description":"List monitors (http, ping, tcp, ai) with URL, label, group, tags and the summarized result of the latest checks (pending, succeeded, warning, failed, errored-or-timed-out). Use for \"Which of my Oh Dear monitors are failing\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"Results per page (1 to 200, default 200).","title":"Page Size"},"page_number":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"}},"title":"list_monitorsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_monitor":{"post":{"operationId":"get_monitor","summary":"Get one monitor by id: URL, label, type, tags, latest result and dates. Use for \"Show Oh Dear monitor 123\".","description":"Get one monitor by id: URL, label, type, tags, latest result and dates. Use for \"Show Oh Dear monitor 123\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monitor_id":{"description":"Numeric monitor id from list_monitors.","maximum":1000000000000,"minimum":1,"title":"Monitor Id","type":"integer"}},"required":["monitor_id"],"title":"get_monitorArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_uptime":{"post":{"operationId":"get_uptime","summary":"Get uptime percentages of a monitor split by hour, day or month over an optional window. Use for \"What was the uptime of","description":"Get uptime percentages of a monitor split by hour, day or month over an optional window. Use for \"What was the uptime of my Oh Dear monitor per day last week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monitor_id":{"description":"Numeric monitor id from list_monitors.","maximum":1000000000000,"minimum":1,"title":"Monitor Id","type":"integer"},"started_at":{"anyOf":[{"maxLength":14,"type":"string"},{"type":"null"}],"default":null,"description":"Window start as YYYYMMDDHHMMSS, for example 20261001000000.","title":"Started At"},"ended_at":{"anyOf":[{"maxLength":14,"type":"string"},{"type":"null"}],"default":null,"description":"Window end as YYYYMMDDHHMMSS.","title":"Ended At"},"split":{"anyOf":[{"enum":["hour","day","month"],"type":"string"},{"type":"null"}],"default":"day","description":"Granularity of the points.","title":"Split"}},"required":["monitor_id"],"title":"get_uptimeArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_downtime":{"post":{"operationId":"list_downtime","summary":"List downtime periods of a monitor with start and end time. Use for \"When was my Oh Dear monitor down\".","description":"List downtime periods of a monitor with start and end time. Use for \"When was my Oh Dear monitor down\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monitor_id":{"description":"Numeric monitor id from list_monitors.","maximum":1000000000000,"minimum":1,"title":"Monitor Id","type":"integer"},"started_at":{"anyOf":[{"maxLength":14,"type":"string"},{"type":"null"}],"default":null,"description":"Window start as YYYYMMDDHHMMSS, for example 20261001000000.","title":"Started At"},"ended_at":{"anyOf":[{"maxLength":14,"type":"string"},{"type":"null"}],"default":null,"description":"Window end as YYYYMMDDHHMMSS.","title":"Ended At"}},"required":["monitor_id"],"title":"list_downtimeArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_check_summary":{"post":{"operationId":"get_check_summary","summary":"Get the current result and a one-line summary for one check type of a monitor (uptime, performance, certificate_health, ","description":"Get the current result and a one-line summary for one check type of a monitor (uptime, performance, certificate_health, broken_links, mixed_content, lighthouse, cron, application_health, sitemap, dns, domain, ai, ports, dns_blocklist). Use for \"Is the certificate check of my Oh Dear monitor healthy\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monitor_id":{"description":"Numeric monitor id from list_monitors.","maximum":1000000000000,"minimum":1,"title":"Monitor Id","type":"integer"},"check_type":{"description":"Check type to summarize.","enum":["uptime","performance","certificate_health","broken_links","mixed_content","lighthouse","cron","application_health","sitemap","dns","domain","ai","ports","dns_blocklist"],"title":"Check Type","type":"string"}},"required":["monitor_id","check_type"],"title":"get_check_summaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_certificate_health":{"post":{"operationId":"get_certificate_health","summary":"Get the TLS certificate details (issuer, valid from and until) and the pass/fail certificate checks of a monitor. Use fo","description":"Get the TLS certificate details (issuer, valid from and until) and the pass/fail certificate checks of a monitor. Use for \"When does the certificate of my Oh Dear monitor expire\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monitor_id":{"description":"Numeric monitor id from list_monitors.","maximum":1000000000000,"minimum":1,"title":"Monitor Id","type":"integer"}},"required":["monitor_id"],"title":"get_certificate_healthArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_broken_links":{"post":{"operationId":"list_broken_links","summary":"List broken links found on a monitored site with the broken URL, HTTP status, the page that links to it and link type. U","description":"List broken links found on a monitored site with the broken URL, HTTP status, the page that links to it and link type. Use for \"Does my Oh Dear monitor 123 have broken links\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monitor_id":{"description":"Numeric monitor id from list_monitors.","maximum":1000000000000,"minimum":1,"title":"Monitor Id","type":"integer"}},"required":["monitor_id"],"title":"list_broken_linksArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_cron_checks":{"post":{"operationId":"list_cron_checks","summary":"List scheduled task (cron) checks of a monitor with name, schedule, grace time, latest result and last ping time. Ping U","description":"List scheduled task (cron) checks of a monitor with name, schedule, grace time, latest result and last ping time. Ping URLs are not returned. Use for \"Are my Oh Dear scheduled tasks running on time\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monitor_id":{"description":"Numeric monitor id from list_monitors.","maximum":1000000000000,"minimum":1,"title":"Monitor Id","type":"integer"}},"required":["monitor_id"],"title":"list_cron_checksArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_status_pages":{"post":{"operationId":"list_status_pages","summary":"List status pages with title, domain, public URL, summarized status (up, down, warning, unknown) and the monitors on eac","description":"List status pages with title, domain, public URL, summarized status (up, down, warning, unknown) and the monitors on each. Use for \"Which Oh Dear status pages do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"Results per page (1 to 200, default 200).","title":"Page Size"},"page_number":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"}},"title":"list_status_pagesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_maintenance_periods":{"post":{"operationId":"list_maintenance_periods","summary":"List maintenance windows of a monitor (alerts are paused) with name, start and end. Use for \"Does my Oh Dear monitor hav","description":"List maintenance windows of a monitor (alerts are paused) with name, start and end. Use for \"Does my Oh Dear monitor have maintenance planned\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monitor_id":{"description":"Numeric monitor id from list_monitors.","maximum":1000000000000,"minimum":1,"title":"Monitor Id","type":"integer"},"started_at":{"anyOf":[{"maxLength":14,"type":"string"},{"type":"null"}],"default":null,"description":"Window start as YYYYMMDDHHMMSS, for example 20261001000000.","title":"Started At"},"ended_at":{"anyOf":[{"maxLength":14,"type":"string"},{"type":"null"}],"default":null,"description":"Window end as YYYYMMDDHHMMSS.","title":"Ended At"}},"required":["monitor_id"],"title":"list_maintenance_periodsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}