{"openapi":"3.1.0","info":{"title":"Better Stack (BYOK) API","version":"0.1.0","description":"Better Stack (BYOK) lets an AI assistant read your own Better Stack data through the Better Stack API with a key you supply (Uptime/Incidents API token). Read-only: 8 tools (list_monitors, get_monitor, list_heartbeats, list_incidents, get_incident, list_status_pages, list_escalation_policies, list_on_call_schedules). The BYOK key travels with each request, is used for that one call only and is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-betterstack.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-betterstack/docs"},"termsOfService":"https://connectorbay.com/byok-betterstack/terms"},"servers":[{"url":"https://byok-betterstack.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-betterstack/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/list_monitors":{"post":{"operationId":"list_monitors","summary":"List uptime monitors with name, URL, type, current status (up, down, paused, pending, validating, maintenance), check fr","description":"List uptime monitors with name, URL, type, current status (up, down, paused, pending, validating, maintenance), check frequency in seconds and last check time. Use for \"Which of my Better Stack monitors are down\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"url":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Only monitors with exactly this URL.","title":"Url"},"pronounceable_name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only monitors with exactly this name.","title":"Pronounceable Name"},"team_name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only resources of this team. Only needed with a global API token that spans several teams.","title":"Team Name"},"per_page":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results per page (1 to 250, default 50).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's pagination.next shows whether another page exists.","title":"Page"}},"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 uptime monitor: URL, type, status, check frequency, regions, team and timestamps. Use for \"Show Better Stack mon","description":"Get one uptime monitor: URL, type, status, check frequency, regions, team and timestamps. Use for \"Show Better Stack monitor 2\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"monitor_id":{"description":"Monitor id from list_monitors, for example '2'.","maxLength":30,"title":"Monitor Id","type":"string"}},"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/list_heartbeats":{"post":{"operationId":"list_heartbeats","summary":"List heartbeat monitors (cron job checks) with name, period and grace in seconds, status and team. Use for \"Are my Bette","description":"List heartbeat monitors (cron job checks) with name, period and grace in seconds, status and team. Use for \"Are my Better Stack heartbeats up\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"team_name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only resources of this team. Only needed with a global API token that spans several teams.","title":"Team Name"},"per_page":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results per page (1 to 250, default 50).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's pagination.next shows whether another page exists.","title":"Page"}},"title":"list_heartbeatsArguments","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_incidents":{"post":{"operationId":"list_incidents","summary":"List incidents, newest first, with cause, status, start, acknowledgement and resolution times. Filter by date range, mon","description":"List incidents, newest first, with cause, status, start, acknowledgement and resolution times. Filter by date range, monitor, resolved or acknowledged. 10 per page by default, 50 at most. Use for \"What incidents are currently open in Better Stack\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for resolved incidents only, false for active ones; leave out for both.","title":"Resolved"},"acknowledged":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for acknowledged incidents only, false for unacknowledged; leave out for both.","title":"Acknowledged"},"from_date":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only incidents from this date (YYYY-MM-DD).","title":"From Date"},"to_date":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only incidents until this date (YYYY-MM-DD).","title":"To Date"},"monitor_id":{"anyOf":[{"maximum":1000000000000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only incidents of this monitor id.","title":"Monitor Id"},"heartbeat_id":{"anyOf":[{"maximum":1000000000000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only incidents of this heartbeat id.","title":"Heartbeat Id"},"team_name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only resources of this team. Only needed with a global API token that spans several teams.","title":"Team Name"},"per_page":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many results per page (1 to 50, default 10).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's pagination.next shows whether another page exists.","title":"Page"}},"title":"list_incidentsArguments","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_incident":{"post":{"operationId":"get_incident","summary":"Get one incident by id: cause, status, times, who acknowledged and resolved it, team and escalation policy. Use for \"Wha","description":"Get one incident by id: cause, status, times, who acknowledged and resolved it, team and escalation policy. Use for \"What happened in Better Stack incident 25\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"incident_id":{"description":"Incident id from list_incidents, for example '25'.","maxLength":30,"title":"Incident Id","type":"string"}},"required":["incident_id"],"title":"get_incidentArguments","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 company name, subdomain, custom domain, published flag and current aggregate state. Use for \"What","description":"List status pages with company name, subdomain, custom domain, published flag and current aggregate state. Use for \"What is the state of my Better Stack status pages\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results per page (1 to 250, default 50).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's pagination.next shows whether another page exists.","title":"Page"}},"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_escalation_policies":{"post":{"operationId":"list_escalation_policies","summary":"List escalation policies with name, repeat settings, team and the steps that notify people. Use for \"How are my Better S","description":"List escalation policies with name, repeat settings, team and the steps that notify people. Use for \"How are my Better Stack escalation policies set up\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"team_name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only resources of this team. Only needed with a global API token that spans several teams.","title":"Team Name"},"per_page":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results per page (1 to 250, default 50).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's pagination.next shows whether another page exists.","title":"Page"}},"title":"list_escalation_policiesArguments","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_on_call_schedules":{"post":{"operationId":"list_on_call_schedules","summary":"List on-call schedules with name, team and who is on call right now (user ids with email). Use for \"Who is on call right","description":"List on-call schedules with name, team and who is on call right now (user ids with email). Use for \"Who is on call right now in Better Stack\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"team_name":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only resources of this team. Only needed with a global API token that spans several teams.","title":"Team Name"},"per_page":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results per page (1 to 250, default 50).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's pagination.next shows whether another page exists.","title":"Page"}},"title":"list_on_call_schedulesArguments","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}}}}