{ "openapi": "3.0.0", "info": { "version": "1.0.0", "title": "OpenStatus API", "contact": { "email": "ping@openstatus.dev", "url": "https://www.openstatus.dev" }, "description": "This version is deprecated please use v2 API: https://api.openstatus.dev/openapi. Read more in the documentation: https://www.openstatus.dev/docs/reference/overview" }, "tags": [ { "name": "monitor", "description": "Monitor related endpoints", "x-displayName": "Monitor" }, { "name": "page", "description": "Page related endpoints", "x-displayName": "Page" }, { "name": "status_report", "description": "Status report related endpoints", "x-displayName": "Status Report" }, { "name": "status_report_update", "description": "Status report update related endpoints", "x-displayName": "Status Report Update" }, { "name": "incident", "description": "Incident related endpoints", "x-displayName": "Incident" }, { "name": "maintenance", "description": "Maintenance related endpoints", "x-displayName": "Maintenance" }, { "name": "notification", "description": "Notification related endpoints", "x-displayName": "Notification" }, { "name": "page_subscriber", "description": "Page subscriber related endpoints", "x-displayName": "Page Subscriber" }, { "name": "check", "description": "Check related endpoints", "x-displayName": "Check" }, { "name": "whoami", "description": "WhoAmI related endpoints", "x-displayName": "WhoAmI" } ], "security": [ { "ApiKeyAuth": [] } ], "components": { "securitySchemes": { "ApiKeyAuth": { "type": "apiKey", "in": "header", "name": "x-openstatus-key", "x-openstatus-key": "string" } }, "schemas": { "Monitor": { "type": "object", "properties": { "id": { "type": "number", "example": 123, "description": "The id of the monitor" }, "periodicity": { "type": "string", "enum": ["30s", "1m", "5m", "10m", "30m", "1h", "other"], "example": "1m", "description": "How often the monitor should run" }, "url": { "type": "string", "example": "https://www.documenso.co", "description": "The url to monitor" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "name": { "type": "string", "example": "documenso-web", "description": "The name of the monitor" }, "externalName": { "type": "string", "nullable": true, "example": "Documenso", "description": "The external name of the monitor, used to display on the status page or in the external notifications" }, "description": { "type": "string", "nullable": true, "example": "Documenso website", "description": "The description of your monitor" }, "method": { "type": "string", "enum": [ "GET", "POST", "HEAD", "PUT", "PATCH", "DELETE", "TRACE", "CONNECT", "OPTIONS" ], "example": "GET" }, "body": { "type": "string", "nullable": true, "default": "", "example": "Hello World", "description": "The body" }, "headers": { "type": "array", "nullable": true, "items": { "type": "object", "properties": { "key": { "type": "string" }, "value": { "type": "string" } }, "required": ["key", "value"] }, "default": [], "description": "The headers of your request", "example": [ { "key": "x-apikey", "value": "supersecrettoken" } ] }, "assertions": { "type": "array", "nullable": true, "items": { "oneOf": [ { "type": "object", "properties": { "type": { "type": "string", "enum": ["status"] }, "compare": { "type": "string", "enum": ["eq", "not_eq", "gt", "gte", "lt", "lte"], "description": "Comparison operator", "examples": ["eq", "not_eq", "gt", "gte", "lt", "lte"] }, "target": { "type": "integer", "minimum": 0, "exclusiveMinimum": true, "description": "The target value" } }, "required": ["type", "compare", "target"], "description": "The status assertion" }, { "type": "object", "properties": { "type": { "type": "string", "enum": ["header"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ] }, "key": { "type": "string", "description": "The key of the header" }, "target": { "type": "string", "description": "the header value" } }, "required": ["type", "compare", "key", "target"], "description": "The header assertion" }, { "type": "object", "properties": { "type": { "type": "string", "enum": ["textBody"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ] }, "target": { "type": "string", "description": "The target value" } }, "required": ["type", "compare", "target"], "description": "The text body assertion" }, { "type": "object", "properties": { "type": { "type": "string", "enum": ["dnsRecord"] }, "key": { "type": "string", "enum": ["A", "AAAA", "CNAME", "MX", "TXT", "NS"] }, "compare": { "type": "string", "enum": ["contains", "not_contains", "eq", "not_eq"] }, "target": { "type": "string" } }, "required": ["type", "key", "compare", "target"], "description": "The DNS record assertion" } ] }, "default": [], "description": "The assertions to run" }, "active": { "type": "boolean", "default": false, "description": "If the monitor is active" }, "public": { "type": "boolean", "default": false, "description": "If the monitor is public" }, "degradedAfter": { "type": "number", "nullable": true, "description": "The time after the monitor is considered degraded in milliseconds" }, "timeout": { "type": "number", "nullable": true, "default": 45000, "description": "The timeout of the request in milliseconds" }, "retry": { "type": "number", "default": 3, "description": "The number of retries to attempt" }, "followRedirects": { "type": "boolean", "default": true, "description": "If the monitor should follow redirects" }, "jobType": { "type": "string", "enum": ["http", "tcp", "icmp", "grpc", "udp", "dns", "ssl"], "default": "http", "description": "The type of the monitor" }, "openTelemetry": { "type": "object", "properties": { "endpoint": { "type": "string", "format": "uri", "default": "http://localhost:4317", "description": "The endpoint of the OpenTelemetry collector" }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "default": {}, "description": "The headers to send to the OpenTelemetry collector" } }, "description": "The OpenTelemetry configuration" } }, "required": ["id", "periodicity", "url", "name", "method"] }, "ErrBadRequest": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "BAD_REQUEST", "FORBIDDEN", "INTERNAL_SERVER_ERROR", "PAYMENT_REQUIRED", "CONFLICT", "NOT_FOUND", "UNAUTHORIZED", "METHOD_NOT_ALLOWED", "UNPROCESSABLE_ENTITY", "TOO_MANY_REQUESTS", "SERVICE_UNAVAILABLE" ], "example": "BAD_REQUEST", "description": "The error code related to the status code." }, "message": { "type": "string", "description": "A human readable message describing the issue.", "example": "" }, "docs": { "type": "string", "description": "A link to the documentation for the error.", "example": "https://www.openstatus.dev/docs/api-references/errors/code/BAD_REQUEST" }, "requestId": { "type": "string", "description": "The request id to be used for debugging and error reporting.", "example": "" } }, "required": ["code", "message", "docs", "requestId"] }, "ErrUnauthorized": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "BAD_REQUEST", "FORBIDDEN", "INTERNAL_SERVER_ERROR", "PAYMENT_REQUIRED", "CONFLICT", "NOT_FOUND", "UNAUTHORIZED", "METHOD_NOT_ALLOWED", "UNPROCESSABLE_ENTITY", "TOO_MANY_REQUESTS", "SERVICE_UNAVAILABLE" ], "example": "UNAUTHORIZED", "description": "The error code related to the status code." }, "message": { "type": "string", "description": "A human readable message describing the issue.", "example": "" }, "docs": { "type": "string", "description": "A link to the documentation for the error.", "example": "https://www.openstatus.dev/docs/api-references/errors/code/UNAUTHORIZED" }, "requestId": { "type": "string", "description": "The request id to be used for debugging and error reporting.", "example": "" } }, "required": ["code", "message", "docs", "requestId"] }, "ErrPaymentRequired": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "BAD_REQUEST", "FORBIDDEN", "INTERNAL_SERVER_ERROR", "PAYMENT_REQUIRED", "CONFLICT", "NOT_FOUND", "UNAUTHORIZED", "METHOD_NOT_ALLOWED", "UNPROCESSABLE_ENTITY", "TOO_MANY_REQUESTS", "SERVICE_UNAVAILABLE" ], "example": "PAYMENT_REQUIRED", "description": "The error code related to the status code." }, "message": { "type": "string", "description": "A human readable message describing the issue.", "example": "" }, "docs": { "type": "string", "description": "A link to the documentation for the error.", "example": "https://www.openstatus.dev/docs/api-references/errors/code/PAYMENT_REQUIRED" }, "requestId": { "type": "string", "description": "The request id to be used for debugging and error reporting.", "example": "" } }, "required": ["code", "message", "docs", "requestId"] }, "ErrForbidden": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "BAD_REQUEST", "FORBIDDEN", "INTERNAL_SERVER_ERROR", "PAYMENT_REQUIRED", "CONFLICT", "NOT_FOUND", "UNAUTHORIZED", "METHOD_NOT_ALLOWED", "UNPROCESSABLE_ENTITY", "TOO_MANY_REQUESTS", "SERVICE_UNAVAILABLE" ], "example": "FORBIDDEN", "description": "The error code related to the status code." }, "message": { "type": "string", "description": "A human readable message describing the issue.", "example": "" }, "docs": { "type": "string", "description": "A link to the documentation for the error.", "example": "https://www.openstatus.dev/docs/api-references/errors/code/FORBIDDEN" }, "requestId": { "type": "string", "description": "The request id to be used for debugging and error reporting.", "example": "" } }, "required": ["code", "message", "docs", "requestId"] }, "ErrNotFound": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "BAD_REQUEST", "FORBIDDEN", "INTERNAL_SERVER_ERROR", "PAYMENT_REQUIRED", "CONFLICT", "NOT_FOUND", "UNAUTHORIZED", "METHOD_NOT_ALLOWED", "UNPROCESSABLE_ENTITY", "TOO_MANY_REQUESTS", "SERVICE_UNAVAILABLE" ], "example": "NOT_FOUND", "description": "The error code related to the status code." }, "message": { "type": "string", "description": "A human readable message describing the issue.", "example": "" }, "docs": { "type": "string", "description": "A link to the documentation for the error.", "example": "https://www.openstatus.dev/docs/api-references/errors/code/NOT_FOUND" }, "requestId": { "type": "string", "description": "The request id to be used for debugging and error reporting.", "example": "" } }, "required": ["code", "message", "docs", "requestId"] }, "ErrConflict": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "BAD_REQUEST", "FORBIDDEN", "INTERNAL_SERVER_ERROR", "PAYMENT_REQUIRED", "CONFLICT", "NOT_FOUND", "UNAUTHORIZED", "METHOD_NOT_ALLOWED", "UNPROCESSABLE_ENTITY", "TOO_MANY_REQUESTS", "SERVICE_UNAVAILABLE" ], "example": "CONFLICT", "description": "The error code related to the status code." }, "message": { "type": "string", "description": "A human readable message describing the issue.", "example": "" }, "docs": { "type": "string", "description": "A link to the documentation for the error.", "example": "https://www.openstatus.dev/docs/api-references/errors/code/CONFLICT" }, "requestId": { "type": "string", "description": "The request id to be used for debugging and error reporting.", "example": "" } }, "required": ["code", "message", "docs", "requestId"] }, "ErrTooManyRequests": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "BAD_REQUEST", "FORBIDDEN", "INTERNAL_SERVER_ERROR", "PAYMENT_REQUIRED", "CONFLICT", "NOT_FOUND", "UNAUTHORIZED", "METHOD_NOT_ALLOWED", "UNPROCESSABLE_ENTITY", "TOO_MANY_REQUESTS", "SERVICE_UNAVAILABLE" ], "example": "TOO_MANY_REQUESTS", "description": "The error code related to the status code." }, "message": { "type": "string", "description": "A human readable message describing the issue.", "example": "" }, "docs": { "type": "string", "description": "A link to the documentation for the error.", "example": "https://www.openstatus.dev/docs/api-references/errors/code/TOO_MANY_REQUESTS" }, "requestId": { "type": "string", "description": "The request id to be used for debugging and error reporting.", "example": "" } }, "required": ["code", "message", "docs", "requestId"] }, "ErrInternalServerError": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "BAD_REQUEST", "FORBIDDEN", "INTERNAL_SERVER_ERROR", "PAYMENT_REQUIRED", "CONFLICT", "NOT_FOUND", "UNAUTHORIZED", "METHOD_NOT_ALLOWED", "UNPROCESSABLE_ENTITY", "TOO_MANY_REQUESTS", "SERVICE_UNAVAILABLE" ], "example": "INTERNAL_SERVER_ERROR", "description": "The error code related to the status code." }, "message": { "type": "string", "description": "A human readable message describing the issue.", "example": "" }, "docs": { "type": "string", "description": "A link to the documentation for the error.", "example": "https://www.openstatus.dev/docs/api-references/errors/code/INTERNAL_SERVER_ERROR" }, "requestId": { "type": "string", "description": "The request id to be used for debugging and error reporting.", "example": "" } }, "required": ["code", "message", "docs", "requestId"] }, "ErrServiceUnavailable": { "type": "object", "properties": { "code": { "type": "string", "enum": [ "BAD_REQUEST", "FORBIDDEN", "INTERNAL_SERVER_ERROR", "PAYMENT_REQUIRED", "CONFLICT", "NOT_FOUND", "UNAUTHORIZED", "METHOD_NOT_ALLOWED", "UNPROCESSABLE_ENTITY", "TOO_MANY_REQUESTS", "SERVICE_UNAVAILABLE" ], "example": "SERVICE_UNAVAILABLE", "description": "The error code related to the status code." }, "message": { "type": "string", "description": "A human readable message describing the issue.", "example": "" }, "docs": { "type": "string", "description": "A link to the documentation for the error.", "example": "https://www.openstatus.dev/docs/api-references/errors/code/SERVICE_UNAVAILABLE" }, "requestId": { "type": "string", "description": "The request id to be used for debugging and error reporting.", "example": "" } }, "required": ["code", "message", "docs", "requestId"] }, "Page": { "type": "object", "properties": { "id": { "type": "number", "description": "The id of the page", "example": 1 }, "title": { "type": "string", "description": "The title of the page", "example": "My Page" }, "description": { "type": "string", "description": "The description of the page", "example": "My awesome status page" }, "slug": { "type": "string", "description": "The slug of the page", "example": "my-page" }, "customDomain": { "type": "string", "nullable": true, "description": "The custom domain of the page. To be configured within the dashboard.", "example": "status.acme.com" }, "icon": { "anyOf": [ { "type": "string", "format": "uri" }, { "type": "string", "enum": [""] }, { "nullable": true } ], "description": "The icon of the page", "example": "https://example.com/icon.png" }, "passwordProtected": { "type": "boolean", "default": false, "description": "Deprecated in favor of `accessType`. Used to set the password protection type. Returns true if `accessType` is set to 'password' and false otherwise.", "example": true, "deprecated": true }, "accessType": { "type": "string", "enum": ["public", "password", "email-domain"], "default": "public", "description": "The access type of the page", "example": "public" }, "password": { "type": "string", "nullable": true, "description": "Your password to protect the page from the public", "example": "hidden-password" }, "authEmailDomains": { "type": "array", "nullable": true, "items": { "type": "string" }, "description": "The email domains of the page", "example": ["example.com", "example.org"] }, "showMonitorValues": { "type": "boolean", "nullable": true, "default": true, "description": "Displays the total and failed request numbers for each monitor. Deprecated and will be removed in the future in favor for `configuration` property.", "example": true, "deprecated": true }, "monitors": { "anyOf": [ { "type": "array", "items": { "type": "number" }, "description": "The monitors of the page as an array of ids. We recommend using the object format to include the order.", "deprecated": true, "example": [1, 2] }, { "type": "array", "items": { "type": "object", "properties": { "monitorId": { "type": "number" }, "order": { "type": "number" } }, "required": ["monitorId", "order"] }, "description": "The monitor as object allowing to pass id and order", "example": [ { "monitorId": 1, "order": 0 }, { "monitorId": 2, "order": 1 } ] } ] } }, "required": ["id", "title", "description", "slug"] }, "StatusReport": { "type": "object", "properties": { "id": { "type": "number", "description": "The id of the status report" }, "title": { "type": "string", "example": "Documenso", "description": "The title of the status report" }, "status": { "type": "string", "enum": ["investigating", "identified", "monitoring", "resolved"], "description": "The current status of the report" }, "statusReportUpdateIds": { "type": "array", "nullable": true, "items": { "type": "number" }, "default": [], "description": "The ids of the status report updates" }, "monitorIds": { "type": "array", "items": { "type": "number" }, "default": [], "description": "Ids of the monitors the status report." }, "pageId": { "type": "number", "description": "The id of the page this status report belongs to" } }, "required": ["id", "title", "status", "pageId"] }, "StatusReportUpdate": { "type": "object", "properties": { "id": { "type": "string", "nullable": true, "description": "The id of the update" }, "status": { "type": "string", "enum": ["investigating", "identified", "monitoring", "resolved"], "description": "The status of the update" }, "date": { "type": "string", "nullable": true, "format": "date-time", "default": "2026-09-10T07:58:20.617Z", "description": "The date of the update in ISO8601 format" }, "message": { "type": "string", "minLength": 1, "description": "The message of the update" }, "statusReportId": { "type": "number", "description": "The id of the status report" } }, "required": ["status", "message", "statusReportId"] }, "Incident": { "type": "object", "properties": { "id": { "type": "number", "description": "The id of the incident", "example": 1 }, "startedAt": { "type": "string", "nullable": true, "format": "date-time", "description": "The date the incident started" }, "monitorId": { "type": "number", "nullable": true, "description": "The id of the monitor associated with the incident", "example": 1 }, "acknowledgedAt": { "type": "string", "nullable": true, "format": "date-time", "description": "The date the incident was acknowledged" }, "acknowledgedBy": { "type": "number", "nullable": true, "description": "The user who acknowledged the incident" }, "resolvedAt": { "type": "string", "nullable": true, "format": "date-time", "description": "The date the incident was resolved" }, "resolvedBy": { "type": "number", "nullable": true, "description": "The user who resolved the incident" } }, "required": [ "id", "startedAt", "monitorId", "acknowledgedBy", "resolvedBy" ] }, "Maintenance": { "type": "object", "properties": { "id": { "type": "number", "description": "The id of the maintenance", "example": 1 }, "title": { "type": "string", "description": "The title of the maintenance", "example": "Database Upgrade" }, "message": { "type": "string", "description": "The message describing the maintenance", "example": "Upgrading database to improve performance" }, "from": { "type": "string", "nullable": true, "format": "date-time", "description": "When the maintenance starts" }, "to": { "type": "string", "nullable": true, "format": "date-time", "description": "When the maintenance ends" }, "monitorIds": { "type": "array", "items": { "type": "number" }, "default": [], "description": "IDs of affected monitors" }, "pageId": { "type": "number", "description": "The id of the status page this maintenance belongs to" } }, "required": ["id", "title", "message", "from", "to", "pageId"] }, "Notification": { "type": "object", "properties": { "id": { "type": "number", "description": "The id of the notification", "example": 1 }, "name": { "type": "string", "description": "The name of the notification", "example": "OpenStatus Discord" }, "provider": { "type": "string", "enum": [ "discord", "email", "google-chat", "grafana-oncall", "ms-teams", "ntfy", "pagerduty", "opsgenie", "slack", "sms", "telegram", "webhook", "whatsapp" ], "description": "The provider of the notification", "example": "discord" }, "payload": { "nullable": true, "description": "The data of the notification" }, "monitors": { "type": "array", "nullable": true, "items": { "type": "number" }, "description": "The monitors that the notification is linked to", "example": [1, 2] } }, "required": ["id", "name", "provider"] }, "PageSubscriber": { "type": "object", "properties": { "id": { "type": "number", "description": "The id of the subscriber", "example": 1 }, "email": { "type": "string", "format": "email", "description": "The email of the subscriber" }, "pageId": { "type": "number", "description": "The id of the page to subscribe to", "example": 1 } }, "required": ["id", "email", "pageId"] }, "Workspace": { "type": "object", "properties": { "name": { "type": "string", "description": "The current workspace name" }, "slug": { "type": "string", "description": "The current workspace slug" }, "plan": { "type": "string", "nullable": true, "enum": ["free", "starter", "team", "scale", null], "default": "free", "description": "The current workspace plan" }, "actor": { "$ref": "#/components/schemas/WhoamiActor" } }, "required": ["slug", "actor"] }, "WhoamiActor": { "type": "object", "properties": { "type": { "type": "string", "enum": ["apiKey"], "description": "Transport surface that authenticated this request" }, "keyId": { "type": "string", "description": "Stable identifier for the API key" }, "scopes": { "type": "array", "items": { "type": "string", "enum": ["read", "write"] }, "description": "Scopes the API key holds. Lets clients introspect what they're allowed to do without probe-and-fail." } }, "required": ["type", "keyId", "scopes"], "description": "Resolved API key actor for this request." } }, "parameters": {} }, "paths": { "/monitor": { "get": { "tags": ["monitor"], "summary": "List all monitors", "responses": { "200": { "description": "All the monitors", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Monitor" } } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "post": { "tags": ["monitor"], "summary": "Create a monitor", "requestBody": { "description": "The monitor to create", "content": { "application/json": { "schema": { "type": "object", "properties": { "periodicity": { "type": "string", "enum": ["30s", "1m", "5m", "10m", "30m", "1h", "other"], "example": "1m", "description": "How often the monitor should run" }, "url": { "type": "string", "example": "https://www.documenso.co", "description": "The url to monitor" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "name": { "type": "string", "example": "documenso-web", "description": "The name of the monitor" }, "externalName": { "type": "string", "nullable": true, "example": "Documenso", "description": "The external name of the monitor, used to display on the status page or in the external notifications" }, "description": { "type": "string", "nullable": true, "example": "Documenso website", "description": "The description of your monitor" }, "method": { "type": "string", "enum": [ "GET", "POST", "HEAD", "PUT", "PATCH", "DELETE", "TRACE", "CONNECT", "OPTIONS" ], "example": "GET" }, "body": { "type": "string", "nullable": true, "default": "", "example": "Hello World", "description": "The body" }, "headers": { "type": "array", "nullable": true, "items": { "type": "object", "properties": { "key": { "type": "string" }, "value": { "type": "string" } }, "required": ["key", "value"] }, "default": [], "description": "The headers of your request", "example": [ { "key": "x-apikey", "value": "supersecrettoken" } ] }, "assertions": { "type": "array", "nullable": true, "items": { "oneOf": [ { "type": "object", "properties": { "type": { "type": "string", "enum": ["status"] }, "compare": { "type": "string", "enum": [ "eq", "not_eq", "gt", "gte", "lt", "lte" ], "description": "Comparison operator", "examples": [ "eq", "not_eq", "gt", "gte", "lt", "lte" ] }, "target": { "type": "integer", "minimum": 0, "exclusiveMinimum": true, "description": "The target value" } }, "required": ["type", "compare", "target"], "description": "The status assertion" }, { "type": "object", "properties": { "type": { "type": "string", "enum": ["header"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ] }, "key": { "type": "string", "description": "The key of the header" }, "target": { "type": "string", "description": "the header value" } }, "required": ["type", "compare", "key", "target"], "description": "The header assertion" }, { "type": "object", "properties": { "type": { "type": "string", "enum": ["textBody"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ] }, "target": { "type": "string", "description": "The target value" } }, "required": ["type", "compare", "target"], "description": "The text body assertion" }, { "type": "object", "properties": { "type": { "type": "string", "enum": ["dnsRecord"] }, "key": { "type": "string", "enum": ["A", "AAAA", "CNAME", "MX", "TXT", "NS"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq" ] }, "target": { "type": "string" } }, "required": ["type", "key", "compare", "target"], "description": "The DNS record assertion" } ] }, "default": [], "description": "The assertions to run" }, "active": { "type": "boolean", "default": false, "description": "If the monitor is active" }, "public": { "type": "boolean", "default": false, "description": "If the monitor is public" }, "degradedAfter": { "type": "number", "nullable": true, "description": "The time after the monitor is considered degraded in milliseconds" }, "timeout": { "type": "number", "nullable": true, "default": 45000, "description": "The timeout of the request in milliseconds" }, "retry": { "type": "number", "default": 3, "description": "The number of retries to attempt" }, "followRedirects": { "type": "boolean", "default": true, "description": "If the monitor should follow redirects" }, "jobType": { "type": "string", "enum": [ "http", "tcp", "icmp", "grpc", "udp", "dns", "ssl" ], "default": "http", "description": "The type of the monitor" }, "openTelemetry": { "type": "object", "properties": { "endpoint": { "type": "string", "format": "uri", "default": "http://localhost:4317", "description": "The endpoint of the OpenTelemetry collector" }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "default": {}, "description": "The headers to send to the OpenTelemetry collector" } }, "description": "The OpenTelemetry configuration" } }, "required": ["periodicity", "url", "name", "method"] } } } }, "responses": { "200": { "description": "Create a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Monitor" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/{id}": { "get": { "tags": ["monitor"], "summary": "Get a monitor", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" } ], "responses": { "200": { "description": "The monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Monitor" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "put": { "tags": ["monitor"], "summary": "Update a monitor", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" } ], "requestBody": { "description": "The monitor to update", "content": { "application/json": { "schema": { "type": "object", "properties": { "periodicity": { "type": "string", "enum": ["30s", "1m", "5m", "10m", "30m", "1h", "other"], "example": "1m", "description": "How often the monitor should run" }, "url": { "type": "string", "example": "https://www.documenso.co", "description": "The url to monitor" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "name": { "type": "string", "example": "documenso-web", "description": "The name of the monitor" }, "externalName": { "type": "string", "nullable": true, "example": "Documenso", "description": "The external name of the monitor, used to display on the status page or in the external notifications" }, "description": { "type": "string", "nullable": true, "example": "Documenso website", "description": "The description of your monitor" }, "method": { "type": "string", "enum": [ "GET", "POST", "HEAD", "PUT", "PATCH", "DELETE", "TRACE", "CONNECT", "OPTIONS" ], "example": "GET" }, "body": { "type": "string", "nullable": true, "default": "", "example": "Hello World", "description": "The body" }, "headers": { "type": "array", "nullable": true, "items": { "type": "object", "properties": { "key": { "type": "string" }, "value": { "type": "string" } }, "required": ["key", "value"] }, "default": [], "description": "The headers of your request", "example": [ { "key": "x-apikey", "value": "supersecrettoken" } ] }, "assertions": { "type": "array", "nullable": true, "items": { "oneOf": [ { "type": "object", "properties": { "type": { "type": "string", "enum": ["status"] }, "compare": { "type": "string", "enum": [ "eq", "not_eq", "gt", "gte", "lt", "lte" ], "description": "Comparison operator", "examples": [ "eq", "not_eq", "gt", "gte", "lt", "lte" ] }, "target": { "type": "integer", "minimum": 0, "exclusiveMinimum": true, "description": "The target value" } }, "required": ["type", "compare", "target"], "description": "The status assertion" }, { "type": "object", "properties": { "type": { "type": "string", "enum": ["header"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ] }, "key": { "type": "string", "description": "The key of the header" }, "target": { "type": "string", "description": "the header value" } }, "required": ["type", "compare", "key", "target"], "description": "The header assertion" }, { "type": "object", "properties": { "type": { "type": "string", "enum": ["textBody"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ] }, "target": { "type": "string", "description": "The target value" } }, "required": ["type", "compare", "target"], "description": "The text body assertion" }, { "type": "object", "properties": { "type": { "type": "string", "enum": ["dnsRecord"] }, "key": { "type": "string", "enum": ["A", "AAAA", "CNAME", "MX", "TXT", "NS"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq" ] }, "target": { "type": "string" } }, "required": ["type", "key", "compare", "target"], "description": "The DNS record assertion" } ] }, "default": [], "description": "The assertions to run" }, "active": { "type": "boolean", "default": false, "description": "If the monitor is active" }, "public": { "type": "boolean", "default": false, "description": "If the monitor is public" }, "degradedAfter": { "type": "number", "nullable": true, "description": "The time after the monitor is considered degraded in milliseconds" }, "timeout": { "type": "number", "nullable": true, "default": 45000, "description": "The timeout of the request in milliseconds" }, "retry": { "type": "number", "default": 3, "description": "The number of retries to attempt" }, "followRedirects": { "type": "boolean", "default": true, "description": "If the monitor should follow redirects" }, "jobType": { "type": "string", "enum": [ "http", "tcp", "icmp", "grpc", "udp", "dns", "ssl" ], "default": "http", "description": "The type of the monitor" }, "openTelemetry": { "type": "object", "properties": { "endpoint": { "type": "string", "format": "uri", "default": "http://localhost:4317", "description": "The endpoint of the OpenTelemetry collector" }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "default": {}, "description": "The headers to send to the OpenTelemetry collector" } }, "description": "The OpenTelemetry configuration" } } } } } }, "responses": { "200": { "description": "Update a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Monitor" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "delete": { "tags": ["monitor"], "summary": "Delete a monitor", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" } ], "responses": { "200": { "description": "The monitor was successfully deleted", "content": { "application/json": { "schema": { "type": "object", "properties": {} } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/http": { "post": { "tags": ["monitor"], "summary": "Create a http monitor", "requestBody": { "description": "The monitor to create", "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the monitor" }, "description": { "type": "string" }, "retry": { "type": "number", "maximum": 10, "minimum": 1, "default": 3, "description": "Number of retries to attempt", "examples": [1, 3, 5] }, "degradedAfter": { "type": "number", "minimum": 0, "default": 30000, "description": "Time in milliseconds to wait before marking the request as degraded", "examples": [30000] }, "timeout": { "type": "number", "minimum": 0, "default": 45000, "description": "Time in milliseconds to wait before marking the request as timed out", "examples": [45000] }, "frequency": { "type": "string", "enum": ["30s", "1m", "5m", "10m", "30m", "1h"] }, "active": { "type": "boolean", "default": false, "description": "Whether the monitor is active" }, "public": { "type": "boolean", "default": false, "description": "Whether the monitor is public" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "openTelemetry": { "type": "object", "nullable": true, "properties": { "endpoint": { "type": "string", "format": "uri", "description": "OTEL endpoint to send metrics to", "examples": ["https://otel.example.com"] }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Headers to send with the OTEL request", "examples": [ { "Content-Type": "application/json" } ] } } }, "assertions": { "type": "array", "items": { "oneOf": [ { "type": "object", "properties": { "kind": { "type": "string", "enum": ["statusCode"] }, "compare": { "type": "string", "enum": [ "eq", "not_eq", "gt", "gte", "lt", "lte" ], "description": "Comparison operator", "examples": [ "eq", "not_eq", "gt", "gte", "lt", "lte" ] }, "target": { "type": "number", "description": "Status code to assert", "examples": [200, 404, 418, 500] } }, "required": ["kind", "compare", "target"], "examples": [ { "kind": "statusCode", "compare": "eq", "target": 200 }, { "kind": "statusCode", "compare": "not_eq", "target": 404 }, { "kind": "statusCode", "compare": "gt", "target": 300 } ] }, { "type": "object", "properties": { "kind": { "type": "string", "enum": ["header"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ], "description": "Comparison operator", "examples": [ "eq", "not_eq", "contains", "not_contains" ] }, "key": { "type": "string", "description": "Header key to assert", "examples": ["Content-Type", "X-Request-ID"] }, "target": { "type": "string", "description": "Header value to assert", "examples": ["application/json", "text/html"] } }, "required": ["kind", "compare", "key", "target"] }, { "type": "object", "properties": { "kind": { "type": "string", "enum": ["textBody"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ], "description": "Comparison operator", "examples": [ "eq", "not_eq", "contains", "not_contains" ] }, "target": { "type": "string", "description": "Text body to assert", "examples": ["Hello, world!", "404 Not Found"] } }, "required": ["kind", "compare", "target"] } ] }, "description": "Assertions to run on the response" }, "request": { "type": "object", "properties": { "method": { "type": "string", "enum": [ "GET", "POST", "HEAD", "PUT", "PATCH", "DELETE", "TRACE", "CONNECT", "OPTIONS" ] }, "url": { "type": "string", "format": "uri", "description": "URL to request", "examples": [ "https://openstat.us", "https://www.openstatus.dev" ] }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Headers to send with the request", "examples": [ { "Content-Type": "application/json" } ] }, "body": { "type": "string", "description": "Body to send with the request", "examples": ["{ \"key\": \"value\" }", "Hello World"] } }, "required": ["method", "url"], "description": "The HTTP Request we are sending" } }, "required": ["name", "frequency", "request"], "title": "HTTP Monitor Schema" } } } }, "responses": { "200": { "description": "Create a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Monitor" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/tcp": { "post": { "tags": ["monitor"], "summary": "Create a tcp monitor", "requestBody": { "description": "The monitor to create", "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the monitor" }, "description": { "type": "string" }, "retry": { "type": "number", "maximum": 10, "minimum": 1, "default": 3, "description": "Number of retries to attempt", "examples": [1, 3, 5] }, "degradedAfter": { "type": "number", "minimum": 0, "default": 30000, "description": "Time in milliseconds to wait before marking the request as degraded", "examples": [30000] }, "timeout": { "type": "number", "minimum": 0, "default": 45000, "description": "Time in milliseconds to wait before marking the request as timed out", "examples": [45000] }, "frequency": { "type": "string", "enum": ["30s", "1m", "5m", "10m", "30m", "1h"] }, "active": { "type": "boolean", "default": false, "description": "Whether the monitor is active" }, "public": { "type": "boolean", "default": false, "description": "Whether the monitor is public" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "openTelemetry": { "type": "object", "nullable": true, "properties": { "endpoint": { "type": "string", "format": "uri", "description": "OTEL endpoint to send metrics to", "examples": ["https://otel.example.com"] }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Headers to send with the OTEL request", "examples": [ { "Content-Type": "application/json" } ] } } }, "request": { "type": "object", "properties": { "host": { "type": "string", "minLength": 1, "examples": ["example.com", "localhost"], "description": "Host to connect to" }, "port": { "type": "number", "description": "Port to connect to", "examples": [80, 443, 1337] } }, "required": ["host", "port"], "description": "The TCP Request we are sending" } }, "required": ["name", "frequency", "request"], "title": "TCP Monitor Schema" } } } }, "responses": { "200": { "description": "Create a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Monitor" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/dns": { "post": { "tags": ["monitor"], "summary": "Create a dns monitor", "requestBody": { "description": "The monitor to create", "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the monitor" }, "description": { "type": "string" }, "retry": { "type": "number", "maximum": 10, "minimum": 1, "default": 3, "description": "Number of retries to attempt", "examples": [1, 3, 5] }, "degradedAfter": { "type": "number", "minimum": 0, "default": 30000, "description": "Time in milliseconds to wait before marking the request as degraded", "examples": [30000] }, "timeout": { "type": "number", "minimum": 0, "default": 45000, "description": "Time in milliseconds to wait before marking the request as timed out", "examples": [45000] }, "frequency": { "type": "string", "enum": ["30s", "1m", "5m", "10m", "30m", "1h"] }, "active": { "type": "boolean", "default": false, "description": "Whether the monitor is active" }, "public": { "type": "boolean", "default": false, "description": "Whether the monitor is public" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "openTelemetry": { "type": "object", "nullable": true, "properties": { "endpoint": { "type": "string", "format": "uri", "description": "OTEL endpoint to send metrics to", "examples": ["https://otel.example.com"] }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Headers to send with the OTEL request", "examples": [ { "Content-Type": "application/json" } ] } } }, "request": { "type": "object", "properties": { "uri": { "type": "string", "description": "The DNS server to query", "examples": ["openstatus.dev"] } }, "required": ["uri"], "description": "The DNS Request we are sending" }, "assertions": { "type": "array", "items": { "type": "object", "properties": { "kind": { "type": "string", "enum": ["dnsRecord"] }, "recordType": { "type": "string", "enum": ["A", "AAAA", "CNAME", "MX", "TXT"], "description": "Type of DNS record to check", "examples": ["A", "CNAME"] }, "compare": { "type": "string", "enum": ["contains", "not_contains", "eq", "not_eq"], "description": "Comparison operator", "examples": [ "eq", "not_eq", "contains", "not_contains" ] }, "target": { "type": "string", "description": "DNS record value to assert", "examples": ["example.com"] } }, "required": ["kind", "recordType", "compare", "target"] }, "description": "Assertions to run on the DNS response" } }, "required": ["name", "frequency", "request"], "title": "DNS Monitor Schema" } } } }, "responses": { "200": { "description": "Create a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Monitor" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/http/{id}": { "put": { "tags": ["monitor"], "summary": "Update an HTTP monitor", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" } ], "requestBody": { "description": "The monitor to update", "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the monitor" }, "description": { "type": "string" }, "retry": { "type": "number", "maximum": 10, "minimum": 1, "default": 3, "description": "Number of retries to attempt", "examples": [1, 3, 5] }, "degradedAfter": { "type": "number", "minimum": 0, "default": 30000, "description": "Time in milliseconds to wait before marking the request as degraded", "examples": [30000] }, "timeout": { "type": "number", "minimum": 0, "default": 45000, "description": "Time in milliseconds to wait before marking the request as timed out", "examples": [45000] }, "frequency": { "type": "string", "enum": ["30s", "1m", "5m", "10m", "30m", "1h"] }, "active": { "type": "boolean", "default": false, "description": "Whether the monitor is active" }, "public": { "type": "boolean", "default": false, "description": "Whether the monitor is public" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "openTelemetry": { "type": "object", "nullable": true, "properties": { "endpoint": { "type": "string", "format": "uri", "description": "OTEL endpoint to send metrics to", "examples": ["https://otel.example.com"] }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Headers to send with the OTEL request", "examples": [ { "Content-Type": "application/json" } ] } } }, "assertions": { "type": "array", "items": { "oneOf": [ { "type": "object", "properties": { "kind": { "type": "string", "enum": ["statusCode"] }, "compare": { "type": "string", "enum": [ "eq", "not_eq", "gt", "gte", "lt", "lte" ], "description": "Comparison operator", "examples": [ "eq", "not_eq", "gt", "gte", "lt", "lte" ] }, "target": { "type": "number", "description": "Status code to assert", "examples": [200, 404, 418, 500] } }, "required": ["kind", "compare", "target"], "examples": [ { "kind": "statusCode", "compare": "eq", "target": 200 }, { "kind": "statusCode", "compare": "not_eq", "target": 404 }, { "kind": "statusCode", "compare": "gt", "target": 300 } ] }, { "type": "object", "properties": { "kind": { "type": "string", "enum": ["header"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ], "description": "Comparison operator", "examples": [ "eq", "not_eq", "contains", "not_contains" ] }, "key": { "type": "string", "description": "Header key to assert", "examples": ["Content-Type", "X-Request-ID"] }, "target": { "type": "string", "description": "Header value to assert", "examples": ["application/json", "text/html"] } }, "required": ["kind", "compare", "key", "target"] }, { "type": "object", "properties": { "kind": { "type": "string", "enum": ["textBody"] }, "compare": { "type": "string", "enum": [ "contains", "not_contains", "eq", "not_eq", "empty", "not_empty", "gt", "gte", "lt", "lte" ], "description": "Comparison operator", "examples": [ "eq", "not_eq", "contains", "not_contains" ] }, "target": { "type": "string", "description": "Text body to assert", "examples": ["Hello, world!", "404 Not Found"] } }, "required": ["kind", "compare", "target"] } ] }, "description": "Assertions to run on the response" }, "request": { "type": "object", "properties": { "method": { "type": "string", "enum": [ "GET", "POST", "HEAD", "PUT", "PATCH", "DELETE", "TRACE", "CONNECT", "OPTIONS" ] }, "url": { "type": "string", "format": "uri", "description": "URL to request", "examples": [ "https://openstat.us", "https://www.openstatus.dev" ] }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Headers to send with the request", "examples": [ { "Content-Type": "application/json" } ] }, "body": { "type": "string", "description": "Body to send with the request", "examples": ["{ \"key\": \"value\" }", "Hello World"] } }, "required": ["method", "url"], "description": "The HTTP Request we are sending" } }, "required": ["name", "frequency", "request"], "title": "HTTP Monitor Schema" } } } }, "responses": { "200": { "description": "Update a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Monitor" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/tcp/{id}": { "put": { "tags": ["monitor"], "summary": "Update an TCP monitor", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" } ], "requestBody": { "description": "The monitor to update", "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the monitor" }, "description": { "type": "string" }, "retry": { "type": "number", "maximum": 10, "minimum": 1, "default": 3, "description": "Number of retries to attempt", "examples": [1, 3, 5] }, "degradedAfter": { "type": "number", "minimum": 0, "default": 30000, "description": "Time in milliseconds to wait before marking the request as degraded", "examples": [30000] }, "timeout": { "type": "number", "minimum": 0, "default": 45000, "description": "Time in milliseconds to wait before marking the request as timed out", "examples": [45000] }, "frequency": { "type": "string", "enum": ["30s", "1m", "5m", "10m", "30m", "1h"] }, "active": { "type": "boolean", "default": false, "description": "Whether the monitor is active" }, "public": { "type": "boolean", "default": false, "description": "Whether the monitor is public" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "openTelemetry": { "type": "object", "nullable": true, "properties": { "endpoint": { "type": "string", "format": "uri", "description": "OTEL endpoint to send metrics to", "examples": ["https://otel.example.com"] }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Headers to send with the OTEL request", "examples": [ { "Content-Type": "application/json" } ] } } }, "request": { "type": "object", "properties": { "host": { "type": "string", "minLength": 1, "examples": ["example.com", "localhost"], "description": "Host to connect to" }, "port": { "type": "number", "description": "Port to connect to", "examples": [80, 443, 1337] } }, "required": ["host", "port"], "description": "The TCP Request we are sending" } }, "required": ["name", "frequency", "request"], "title": "TCP Monitor Schema" } } } }, "responses": { "200": { "description": "Update a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Monitor" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/dns/{id}": { "put": { "tags": ["monitor"], "summary": "Update an DNS monitor", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" } ], "requestBody": { "description": "The monitor to update", "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the monitor" }, "description": { "type": "string" }, "retry": { "type": "number", "maximum": 10, "minimum": 1, "default": 3, "description": "Number of retries to attempt", "examples": [1, 3, 5] }, "degradedAfter": { "type": "number", "minimum": 0, "default": 30000, "description": "Time in milliseconds to wait before marking the request as degraded", "examples": [30000] }, "timeout": { "type": "number", "minimum": 0, "default": 45000, "description": "Time in milliseconds to wait before marking the request as timed out", "examples": [45000] }, "frequency": { "type": "string", "enum": ["30s", "1m", "5m", "10m", "30m", "1h"] }, "active": { "type": "boolean", "default": false, "description": "Whether the monitor is active" }, "public": { "type": "boolean", "default": false, "description": "Whether the monitor is public" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "openTelemetry": { "type": "object", "nullable": true, "properties": { "endpoint": { "type": "string", "format": "uri", "description": "OTEL endpoint to send metrics to", "examples": ["https://otel.example.com"] }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Headers to send with the OTEL request", "examples": [ { "Content-Type": "application/json" } ] } } }, "request": { "type": "object", "properties": { "uri": { "type": "string", "description": "The DNS server to query", "examples": ["openstatus.dev"] } }, "required": ["uri"], "description": "The DNS Request we are sending" }, "assertions": { "type": "array", "items": { "type": "object", "properties": { "kind": { "type": "string", "enum": ["dnsRecord"] }, "recordType": { "type": "string", "enum": ["A", "AAAA", "CNAME", "MX", "TXT"], "description": "Type of DNS record to check", "examples": ["A", "CNAME"] }, "compare": { "type": "string", "enum": ["contains", "not_contains", "eq", "not_eq"], "description": "Comparison operator", "examples": [ "eq", "not_eq", "contains", "not_contains" ] }, "target": { "type": "string", "description": "DNS record value to assert", "examples": ["example.com"] } }, "required": ["kind", "recordType", "compare", "target"] }, "description": "Assertions to run on the DNS response" } }, "required": ["name", "frequency", "request"], "title": "DNS Monitor Schema" } } } }, "responses": { "200": { "description": "Update a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Monitor" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/{id}/summary": { "get": { "tags": ["monitor"], "summary": "Get a monitor summary", "description": "Get a monitor summary of the last 45 days of data to be used within a status page", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" } ], "responses": { "200": { "description": "All the historical metrics", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "array", "items": { "type": "object", "properties": { "ok": { "type": "integer", "description": "The number of ok responses (defined by the assertions - or by default status code 200)" }, "count": { "type": "integer", "description": "The total number of request" }, "day": { "type": "string", "nullable": true, "format": "date-time", "description": "The date of the daily stat in ISO8601 format" } }, "required": ["ok", "count", "day"] } } }, "required": ["data"] } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/{id}/trigger": { "post": { "tags": ["monitor"], "summary": "Create a monitor trigger", "description": "Trigger a monitor check without waiting the result", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" } ], "responses": { "200": { "description": "Returns a result id that can be used to get the result of your trigger", "content": { "application/json": { "schema": { "type": "object", "properties": { "resultId": { "type": "number", "description": "the id of your check result" } }, "required": ["resultId"] } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/{id}/result/{resultId}": { "get": { "tags": ["monitor"], "summary": "Get a monitor result", "description": "**WARNING:** This works only for HTTP monitors. We will add support for other types of monitors soon.", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" }, { "schema": { "type": "string", "description": "The id of the result" }, "required": true, "description": "The id of the result", "name": "resultId", "in": "path" } ], "responses": { "200": { "description": "All the metrics for the result id from the monitor", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object", "properties": { "latency": { "type": "integer" }, "statusCode": { "type": "integer", "nullable": true, "default": null }, "monitorId": { "type": "string", "default": "" }, "url": { "type": "string" }, "error": { "type": "boolean", "nullable": true, "default": false }, "region": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "timestamp": { "type": "integer" }, "message": { "type": "string", "nullable": true }, "timing": { "type": "object", "nullable": true, "properties": { "dnsStart": { "type": "number" }, "dnsDone": { "type": "number" }, "connectStart": { "type": "number" }, "connectDone": { "type": "number" }, "tlsHandshakeStart": { "type": "number" }, "tlsHandshakeDone": { "type": "number" }, "firstByteStart": { "type": "number" }, "firstByteDone": { "type": "number" }, "transferStart": { "type": "number" }, "transferDone": { "type": "number" } }, "required": [ "dnsStart", "dnsDone", "connectStart", "connectDone", "tlsHandshakeStart", "tlsHandshakeDone", "firstByteStart", "firstByteDone", "transferStart", "transferDone" ] } }, "required": ["latency", "region"] } } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/monitor/{id}/run": { "post": { "tags": ["monitor"], "summary": "Create a monitor run", "description": "Run a synthetic check for a specific monitor. It will take all configs into account.", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the monitor", "example": "1" }, "required": true, "description": "The id of the monitor", "name": "id", "in": "path" }, { "schema": { "type": "boolean", "nullable": true, "default": false, "description": "Don't wait for the result" }, "required": false, "description": "Don't wait for the result", "name": "no-wait", "in": "query" } ], "responses": { "200": { "description": "All the historical metrics", "content": { "application/json": { "schema": { "type": "array", "items": { "oneOf": [ { "type": "object", "properties": { "jobType": { "type": "string", "enum": ["http"] }, "status": { "type": "number" }, "latency": { "type": "number" }, "region": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "timestamp": { "type": "number" }, "timing": { "type": "object", "properties": { "dnsStart": { "type": "number" }, "dnsDone": { "type": "number" }, "connectStart": { "type": "number" }, "connectDone": { "type": "number" }, "tlsHandshakeStart": { "type": "number" }, "tlsHandshakeDone": { "type": "number" }, "firstByteStart": { "type": "number" }, "firstByteDone": { "type": "number" }, "transferStart": { "type": "number" }, "transferDone": { "type": "number" } }, "required": [ "dnsStart", "dnsDone", "connectStart", "connectDone", "tlsHandshakeStart", "tlsHandshakeDone", "firstByteStart", "firstByteDone", "transferStart", "transferDone" ] }, "body": { "type": "string", "nullable": true }, "error": { "type": "string", "nullable": true } }, "required": [ "jobType", "status", "latency", "region", "timestamp", "timing" ] }, { "type": "object", "properties": { "jobType": { "type": "string", "enum": ["tcp"] }, "latency": { "type": "number" }, "region": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "timestamp": { "type": "number" }, "timing": { "type": "object", "properties": { "tcpStart": { "type": "number" }, "tcpDone": { "type": "number" } }, "required": ["tcpStart", "tcpDone"] }, "error": { "type": "number", "nullable": true }, "errorMessage": { "type": "string", "nullable": true } }, "required": [ "jobType", "latency", "region", "timestamp", "timing" ] } ] } } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/page/{id}": { "get": { "tags": ["page"], "summary": "Get a status page", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the page", "example": "1" }, "required": true, "description": "The id of the page", "name": "id", "in": "path" } ], "responses": { "200": { "description": "Get an Status page", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Page" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "put": { "tags": ["page"], "summary": "Update a status page", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the page", "example": "1" }, "required": true, "description": "The id of the page", "name": "id", "in": "path" } ], "requestBody": { "description": "The monitor to update", "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string", "description": "The title of the page", "example": "My Page" }, "description": { "type": "string", "description": "The description of the page", "example": "My awesome status page" }, "slug": { "type": "string", "description": "The slug of the page", "example": "my-page" }, "customDomain": { "type": "string", "nullable": true, "description": "The custom domain of the page. To be configured within the dashboard.", "example": "status.acme.com" }, "icon": { "anyOf": [ { "type": "string", "format": "uri" }, { "type": "string", "enum": [""] }, { "nullable": true } ], "description": "The icon of the page", "example": "https://example.com/icon.png" }, "passwordProtected": { "type": "boolean", "default": false, "description": "Deprecated in favor of `accessType`. Used to set the password protection type. Returns true if `accessType` is set to 'password' and false otherwise.", "example": true, "deprecated": true }, "accessType": { "type": "string", "enum": ["public", "password", "email-domain"], "default": "public", "description": "The access type of the page", "example": "public" }, "password": { "type": "string", "nullable": true, "description": "Your password to protect the page from the public", "example": "hidden-password" }, "authEmailDomains": { "type": "array", "nullable": true, "items": { "type": "string" }, "description": "The email domains of the page", "example": ["example.com", "example.org"] }, "showMonitorValues": { "type": "boolean", "nullable": true, "default": true, "description": "Displays the total and failed request numbers for each monitor. Deprecated and will be removed in the future in favor for `configuration` property.", "example": true, "deprecated": true }, "monitors": { "anyOf": [ { "type": "array", "items": { "type": "number" }, "description": "The monitors of the page as an array of ids. We recommend using the object format to include the order.", "deprecated": true, "example": [1, 2] }, { "type": "array", "items": { "type": "object", "properties": { "monitorId": { "type": "number" }, "order": { "type": "number" } }, "required": ["monitorId", "order"] }, "description": "The monitor as object allowing to pass id and order", "example": [ { "monitorId": 1, "order": 0 }, { "monitorId": 2, "order": 1 } ] } ] } } } } } }, "responses": { "200": { "description": "Get an Status page", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Page" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/page": { "get": { "tags": ["page"], "summary": "List all status pages", "responses": { "200": { "description": "A list of your status pages", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Page" } } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "post": { "tags": ["page"], "summary": "Create a status page", "requestBody": { "description": "The status page to create", "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string", "description": "The title of the page", "example": "My Page" }, "description": { "type": "string", "description": "The description of the page", "example": "My awesome status page" }, "slug": { "type": "string", "description": "The slug of the page", "example": "my-page" }, "customDomain": { "type": "string", "nullable": true, "description": "The custom domain of the page. To be configured within the dashboard.", "example": "status.acme.com" }, "icon": { "anyOf": [ { "type": "string", "format": "uri" }, { "type": "string", "enum": [""] }, { "nullable": true } ], "description": "The icon of the page", "example": "https://example.com/icon.png" }, "passwordProtected": { "type": "boolean", "default": false, "description": "Deprecated in favor of `accessType`. Used to set the password protection type. Returns true if `accessType` is set to 'password' and false otherwise.", "example": true, "deprecated": true }, "accessType": { "type": "string", "enum": ["public", "password", "email-domain"], "default": "public", "description": "The access type of the page", "example": "public" }, "password": { "type": "string", "nullable": true, "description": "Your password to protect the page from the public", "example": "hidden-password" }, "authEmailDomains": { "type": "array", "nullable": true, "items": { "type": "string" }, "description": "The email domains of the page", "example": ["example.com", "example.org"] }, "showMonitorValues": { "type": "boolean", "nullable": true, "default": true, "description": "Displays the total and failed request numbers for each monitor. Deprecated and will be removed in the future in favor for `configuration` property.", "example": true, "deprecated": true }, "monitors": { "anyOf": [ { "type": "array", "items": { "type": "number" }, "description": "The monitors of the page as an array of ids. We recommend using the object format to include the order.", "deprecated": true, "example": [1, 2] }, { "type": "array", "items": { "type": "object", "properties": { "monitorId": { "type": "number" }, "order": { "type": "number" } }, "required": ["monitorId", "order"] }, "description": "The monitor as object allowing to pass id and order", "example": [ { "monitorId": 1, "order": 0 }, { "monitorId": 2, "order": 1 } ] } ] } }, "required": ["title", "description", "slug"] } } } }, "responses": { "200": { "description": "Get an Status page", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Page" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/status_report": { "get": { "tags": ["status_report"], "summary": "List all status reports", "responses": { "200": { "description": "Get all status reports", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/StatusReport" } } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "post": { "tags": ["status_report"], "summary": "Create a status report", "requestBody": { "description": "The status report to create", "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string", "example": "Documenso", "description": "The title of the status report" }, "status": { "type": "string", "enum": [ "investigating", "identified", "monitoring", "resolved" ], "description": "The current status of the report" }, "monitorIds": { "type": "array", "items": { "type": "number" }, "default": [], "description": "Ids of the monitors the status report." }, "pageId": { "type": "number", "description": "The id of the page this status report belongs to" }, "date": { "type": "string", "nullable": true, "format": "date-time", "default": "2026-09-10T07:58:20.617Z", "description": "The date of the report in ISO8601 format, defaults to now" }, "message": { "type": "string", "description": "The message of the current status of incident" } }, "required": ["title", "status", "pageId", "message"] } } } }, "responses": { "200": { "description": "The created status report", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusReport" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/status_report/{id}": { "delete": { "tags": ["status_report"], "summary": "Delete a status report", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the status report", "example": "1" }, "required": true, "description": "The id of the status report", "name": "id", "in": "path" } ], "responses": { "200": { "description": "Status report deleted", "content": { "application/json": { "schema": { "type": "object", "properties": {} } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "get": { "tags": ["status_report"], "summary": "Get a status report", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the status report", "example": "1" }, "required": true, "description": "The id of the status report", "name": "id", "in": "path" } ], "responses": { "200": { "description": "Get all status reports", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusReport" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/status_report/{id}/update": { "post": { "tags": ["status_report"], "summary": "Create a status report update", "deprecated": true, "description": "Preferably use [`/status-report-updates`](#tag/status_report_update/POST/status_report_update) instead.", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the status report", "example": "1" }, "required": true, "description": "The id of the status report", "name": "id", "in": "path" } ], "requestBody": { "description": "the status report update", "content": { "application/json": { "schema": { "type": "object", "properties": { "status": { "type": "string", "enum": [ "investigating", "identified", "monitoring", "resolved" ], "description": "The status of the update" }, "date": { "type": "string", "nullable": true, "format": "date-time", "default": "2026-09-10T07:58:20.617Z", "description": "The date of the update in ISO8601 format" }, "message": { "type": "string", "minLength": 1, "description": "The message of the update" } }, "required": ["status", "message"] } } } }, "responses": { "200": { "description": "Status report updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusReport" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/status_report_update/{id}": { "get": { "tags": ["status_report_update"], "summary": "Get a status report update", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the update", "example": "1" }, "required": true, "description": "The id of the update", "name": "id", "in": "path" } ], "responses": { "200": { "description": "Get a status report update", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusReportUpdate" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/status_report_update": { "post": { "tags": ["status_report_update"], "summary": "Create a status report update", "requestBody": { "description": "The status report update to create", "content": { "application/json": { "schema": { "type": "object", "properties": { "status": { "type": "string", "enum": [ "investigating", "identified", "monitoring", "resolved" ], "description": "The status of the update" }, "date": { "type": "string", "nullable": true, "format": "date-time", "default": "2026-09-10T07:58:20.617Z", "description": "The date of the update in ISO8601 format" }, "message": { "type": "string", "minLength": 1, "description": "The message of the update" }, "statusReportId": { "type": "number", "description": "The id of the status report" } }, "required": ["status", "message", "statusReportId"] } } } }, "responses": { "200": { "description": "The created status report update", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusReportUpdate" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/incident": { "get": { "tags": ["incident"], "summary": "List all incidents", "responses": { "200": { "description": "Get all incidents", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Incident" } } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/incident/{id}": { "get": { "tags": ["incident"], "summary": "Get an incident", "parameters": [ { "schema": { "type": "string", "minLength": 1, "pattern": "^\\d+$", "description": "The id of the Incident", "example": "1" }, "required": true, "description": "The id of the Incident", "name": "id", "in": "path" } ], "responses": { "200": { "description": "Get an incident", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Incident" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "put": { "tags": ["incident"], "summary": "Update an incident", "description": "Acknowledge or resolve an incident", "parameters": [ { "schema": { "type": "string", "minLength": 1, "pattern": "^\\d+$", "description": "The id of the Incident", "example": "1" }, "required": true, "description": "The id of the Incident", "name": "id", "in": "path" } ], "requestBody": { "description": "The incident to update", "content": { "application/json": { "schema": { "type": "object", "properties": { "acknowledgedAt": { "type": "string", "nullable": true, "format": "date-time", "description": "The date the incident was acknowledged" }, "resolvedAt": { "type": "string", "nullable": true, "format": "date-time", "description": "The date the incident was resolved" } } } } } }, "responses": { "200": { "description": "Update a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Incident" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/maintenance": { "get": { "tags": ["maintenance"], "summary": "List all maintenances", "responses": { "200": { "description": "Get all maintenances", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Maintenance" } } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "post": { "tags": ["maintenance"], "summary": "Create a maintenance", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string", "description": "The title of the maintenance", "example": "Database Upgrade" }, "message": { "type": "string", "description": "The message describing the maintenance", "example": "Upgrading database to improve performance" }, "from": { "type": "string", "nullable": true, "format": "date-time", "description": "When the maintenance starts" }, "to": { "type": "string", "nullable": true, "format": "date-time", "description": "When the maintenance ends" }, "monitorIds": { "type": "array", "items": { "type": "number" }, "default": [], "description": "IDs of affected monitors" }, "pageId": { "type": "number", "description": "The id of the status page this maintenance belongs to" } }, "required": ["title", "message", "from", "to", "pageId"] } } } }, "responses": { "200": { "description": "Create a maintenance", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Maintenance" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/maintenance/{id}": { "get": { "tags": ["maintenance"], "summary": "Get a maintenance", "parameters": [ { "schema": { "type": "string", "minLength": 1, "pattern": "^\\d+$", "description": "The id of the maintenance", "example": "1" }, "required": true, "description": "The id of the maintenance", "name": "id", "in": "path" } ], "responses": { "200": { "description": "Get a maintenance", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Maintenance" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "put": { "tags": ["maintenance"], "summary": "Update a maintenance", "parameters": [ { "schema": { "type": "string", "minLength": 1, "pattern": "^\\d+$", "description": "The id of the maintenance", "example": "1" }, "required": true, "description": "The id of the maintenance", "name": "id", "in": "path" } ], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string", "description": "The title of the maintenance", "example": "Database Upgrade" }, "message": { "type": "string", "description": "The message describing the maintenance", "example": "Upgrading database to improve performance" }, "from": { "type": "string", "nullable": true, "format": "date-time", "description": "When the maintenance starts" }, "to": { "type": "string", "nullable": true, "format": "date-time", "description": "When the maintenance ends" }, "monitorIds": { "type": "array", "items": { "type": "number" }, "default": [], "description": "IDs of affected monitors" }, "pageId": { "type": "number", "description": "The id of the status page this maintenance belongs to" } } } } } }, "responses": { "200": { "description": "Update a maintenance", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Maintenance" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/notification": { "get": { "tags": ["notification"], "summary": "List all notifications", "responses": { "200": { "description": "Get all your workspace notification", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Notification" } } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } }, "post": { "tags": ["notification"], "summary": "Create a notification", "requestBody": { "description": "The notification to create", "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "The name of the notification", "example": "OpenStatus Discord" }, "provider": { "type": "string", "enum": [ "discord", "email", "google-chat", "grafana-oncall", "ms-teams", "ntfy", "pagerduty", "opsgenie", "slack", "sms", "telegram", "webhook", "whatsapp" ], "description": "The provider of the notification", "example": "discord" }, "payload": { "nullable": true, "description": "The data of the notification" }, "monitors": { "type": "array", "nullable": true, "items": { "type": "number" }, "description": "The monitors that the notification is linked to", "example": [1, 2] } }, "required": ["name", "provider"] } } } }, "responses": { "200": { "description": "Return the created notification", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Notification" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/notification/{id}": { "get": { "tags": ["notification"], "summary": "Get a notification", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the notification", "example": "1" }, "required": true, "description": "The id of the notification", "name": "id", "in": "path" } ], "responses": { "200": { "description": "Get an Status page", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Notification" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/page_subscriber/{id}/update": { "post": { "tags": ["page_subscriber"], "summary": "Subscribe to a status page", "description": "Add a subscriber to a status page", "parameters": [ { "schema": { "type": "string", "minLength": 1, "description": "The id of the page", "example": "1" }, "required": true, "description": "The id of the page", "name": "id", "in": "path" } ], "requestBody": { "description": "The subscriber payload", "content": { "application/json": { "schema": { "type": "object", "properties": { "email": { "type": "string", "format": "email", "description": "The email of the subscriber" } }, "required": ["email"] } } } }, "responses": { "200": { "description": "The user has been subscribed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PageSubscriber" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/check/http": { "post": { "tags": ["check"], "summary": "Run a single check", "requestBody": { "description": "The run request to create", "content": { "application/json": { "schema": { "type": "object", "properties": { "url": { "type": "string", "example": "https://www.documenso.co", "description": "The url to monitor" }, "body": { "type": "string", "nullable": true, "default": "", "example": "Hello World", "description": "The body" }, "headers": { "type": "array", "nullable": true, "items": { "type": "object", "properties": { "key": { "type": "string" }, "value": { "type": "string" } }, "required": ["key", "value"] }, "default": [], "description": "The headers of your request", "example": [ { "key": "x-apikey", "value": "supersecrettoken" } ] }, "method": { "type": "string", "enum": [ "GET", "POST", "HEAD", "PUT", "PATCH", "DELETE", "TRACE", "CONNECT", "OPTIONS" ], "example": "GET" }, "regions": { "type": "array", "nullable": true, "items": { "type": "string", "enum": [ "ams", "arn", "atl", "bog", "bom", "bos", "cdg", "den", "dfw", "ewr", "eze", "fra", "gdl", "gig", "gru", "hkg", "iad", "jnb", "lax", "lhr", "mad", "mia", "nrt", "ord", "otp", "phx", "qro", "scl", "sjc", "sea", "sin", "syd", "waw", "yul", "yyz", "koyeb_fra", "koyeb_was", "koyeb_sin", "koyeb_tyo", "koyeb_par", "koyeb_sfo", "railway_europe-west4-drams3a", "railway_us-east4-eqdc4a", "railway_asia-southeast1-eqsg3a", "railway_us-west2" ] }, "default": [], "example": ["ams"], "description": "Where we should monitor it" }, "runCount": { "type": "number", "maximum": 5, "default": 1, "description": "The number of times to run the check" }, "aggregated": { "type": "boolean", "description": "Whether to aggregate the results or not" } }, "required": ["url", "method"], "description": "The check request" } } } }, "responses": { "200": { "description": "Return a run result", "content": { "application/json": { "schema": { "type": "object", "properties": { "id": { "type": "integer", "description": "The id of the check" }, "raw": { "type": "array", "items": { "type": "object", "properties": { "dnsStart": { "type": "number", "description": "DNS timestamp start time in UTC " }, "dnsDone": { "type": "number", "description": "DNS timestamp end time in UTC " }, "connectStart": { "type": "number", "description": "Connect timestamp start time in UTC " }, "connectDone": { "type": "number", "description": "Connect timestamp end time in UTC " }, "tlsHandshakeStart": { "type": "number", "description": "TLS handshake timestamp start time in UTC " }, "tlsHandshakeDone": { "type": "number", "description": "TLS handshake timestamp end time in UTC " }, "firstByteStart": { "type": "number", "description": "First byte timestamp start time in UTC " }, "firstByteDone": { "type": "number", "description": "First byte timestamp end time in UTC " }, "transferStart": { "type": "number", "description": "Transfer timestamp start time in UTC " }, "transferDone": { "type": "number", "description": "Transfer timestamp end time in UTC " } }, "required": [ "dnsStart", "dnsDone", "connectStart", "connectDone", "tlsHandshakeStart", "tlsHandshakeDone", "firstByteStart", "firstByteDone", "transferStart", "transferDone" ] }, "description": "The raw data of the check" }, "response": { "type": "object", "properties": { "timestamp": { "type": "number", "description": "The timestamp of the response in UTC" }, "status": { "type": "number", "description": "The status code of the response" }, "latency": { "type": "number", "description": "The latency of the response" }, "body": { "type": "string", "description": "The body of the response" }, "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "The headers of the response" }, "timing": { "type": "object", "properties": { "dnsStart": { "type": "number", "description": "DNS timestamp start time in UTC " }, "dnsDone": { "type": "number", "description": "DNS timestamp end time in UTC " }, "connectStart": { "type": "number", "description": "Connect timestamp start time in UTC " }, "connectDone": { "type": "number", "description": "Connect timestamp end time in UTC " }, "tlsHandshakeStart": { "type": "number", "description": "TLS handshake timestamp start time in UTC " }, "tlsHandshakeDone": { "type": "number", "description": "TLS handshake timestamp end time in UTC " }, "firstByteStart": { "type": "number", "description": "First byte timestamp start time in UTC " }, "firstByteDone": { "type": "number", "description": "First byte timestamp end time in UTC " }, "transferStart": { "type": "number", "description": "Transfer timestamp start time in UTC " }, "transferDone": { "type": "number", "description": "Transfer timestamp end time in UTC " } }, "required": [ "dnsStart", "dnsDone", "connectStart", "connectDone", "tlsHandshakeStart", "tlsHandshakeDone", "firstByteStart", "firstByteDone", "transferStart", "transferDone" ], "description": "The timing metrics of the response" }, "aggregated": { "type": "object", "properties": { "dns": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated DNS timing of the check" }, "connection": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated connection timing of the check" }, "tls": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated tls timing of the check" }, "firstByte": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated first byte timing of the check" }, "transfer": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated transfer timing of the check" }, "latency": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated latency timing of the check" } }, "required": [ "dns", "connection", "tls", "firstByte", "transfer", "latency" ], "description": "The aggregated data dns timing of the check" }, "region": { "type": "string", "description": "The region where the check ran" } }, "required": [ "timestamp", "status", "latency", "timing", "region" ], "description": "The last response of the check" }, "aggregated": { "type": "object", "properties": { "dns": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated data of the check" }, "connect": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated data of the check" }, "tls": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated data of the check" }, "firstByte": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated data of the check" }, "transfer": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated data of the check" }, "latency": { "type": "object", "properties": { "p50": { "type": "number", "description": "The 50th percentile" }, "p75": { "type": "number", "description": "The 75th percentile" }, "p95": { "type": "number", "description": "The 95th percentile" }, "p99": { "type": "number", "description": "The 99th percentile" }, "min": { "type": "number", "description": "The minimum value" }, "max": { "type": "number", "description": "The maximum value" } }, "required": [ "p50", "p75", "p95", "p99", "min", "max" ], "description": "The aggregated data of the check" } }, "required": [ "dns", "connect", "tls", "firstByte", "transfer", "latency" ], "description": "The aggregated data of the check" } }, "required": ["id", "raw", "response"] } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } }, "/whoami": { "get": { "tags": ["whoami"], "summary": "Get your information", "description": "Get the current workspace information attached to the API key.", "responses": { "200": { "description": "The current workspace information with the limits", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Workspace" } } } }, "400": { "description": "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrBadRequest" } } } }, "401": { "description": "The client must authenticate itself to get the requested response.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrUnauthorized" } } } }, "402": { "description": "A higher pricing plan is required to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrPaymentRequired" } } } }, "403": { "description": "The client does not have the necessary permissions to access the resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrForbidden" } } } }, "404": { "description": "The server can't find the requested resource.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrNotFound" } } } }, "409": { "description": "The request could not be completed due to a conflict mainly due to unique constraints.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrConflict" } } } }, "429": { "description": "The rate limit for the API key, token or client IP was exceeded. Retry after the number of seconds in the `Retry-After` header. See https://www.openstatus.dev/docs/reference/api-rate-limits.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 7 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrTooManyRequests" } } } }, "500": { "description": "The server has encountered a situation it doesn't know how to handle.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrInternalServerError" } } } }, "503": { "description": "The server is shedding load. Retry after the number of seconds in the `Retry-After` header.", "headers": { "Retry-After": { "description": "Seconds to wait before retrying.", "schema": { "type": "integer", "example": 5 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrServiceUnavailable" } } } } } } } } }