openstatusHQ / openstatus
8,653 TypeScript🫖 Status page with uptime monitoring & API monitoring as code 🫖
OpenStatus API Specification
Located in apps/server/static/openapi-v1.json on branch HEAD
3.0.0
JSON
28 Endpoints
308.5 KB
Operations & Route Endpoints (39)
Raw JSON Specification
{
"openapi": "3.0.0",
"info": {
"version": "1.0.0",
"title": "OpenStatus API",
"contact": {
"email": "[email protected]",
"url": "https://www.openstatus.dev"
},
"description": "This version is deprecated please use v2"
},
"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",
"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"
],
"example": "BAD_REQUEST",
"description": "The error code related to the status code."
},
"message": {
"type": "string",
"description": "A human readable message describing the issue.",
"example": "<string>"
},
"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": "<uuid>"
}
},
"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"
],
"example": "UNAUTHORIZED",
"description": "The error code related to the status code."
},
"message": {
"type": "string",
"description": "A human readable message describing the issue.",
"example": "<string>"
},
"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": "<uuid>"
}
},
"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"
],
"example": "PAYMENT_REQUIRED",
"description": "The error code related to the status code."
},
"message": {
"type": "string",
"description": "A human readable message describing the issue.",
"example": "<string>"
},
"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": "<uuid>"
}
},
"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"
],
"example": "FORBIDDEN",
"description": "The error code related to the status code."
},
"message": {
"type": "string",
"description": "A human readable message describing the issue.",
"example": "<string>"
},
"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": "<uuid>"
}
},
"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"
],
"example": "NOT_FOUND",
"description": "The error code related to the status code."
},
"message": {
"type": "string",
"description": "A human readable message describing the issue.",
"example": "<string>"
},
"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": "<uuid>"
}
},
"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"
],
"example": "CONFLICT",
"description": "The error code related to the status code."
},
"message": {
"type": "string",
"description": "A human readable message describing the issue.",
"example": "<string>"
},
"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": "<uuid>"
}
},
"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"
],
"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": "<string>"
},
"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": "<uuid>"
}
},
"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",
"default": "2026-02-12T22:01:46.114Z",
"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",
"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",
"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",
"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",
"description": "When the maintenance starts"
},
"to": {
"type": "string",
"nullable": true,
"format": "date",
"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": {
"anyOf": [
{
"type": "object",
"properties": {
"discord": {
"type": "string",
"format": "uri"
}
},
"required": [
"discord"
]
},
{
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
}
},
"required": [
"email"
]
},
{
"type": "object",
"properties": {
"grafana-oncall": {
"type": "object",
"properties": {
"webhookUrl": {
"type": "string",
"format": "uri"
}
},
"required": [
"webhookUrl"
]
}
},
"required": [
"grafana-oncall"
]
},
{
"type": "object",
"properties": {
"ms-teams": {
"type": "object",
"properties": {
"webhookUrl": {
"type": "string",
"format": "uri"
}
},
"required": [
"webhookUrl"
]
}
},
"required": [
"ms-teams"
]
},
{
"type": "object",
"properties": {
"ntfy": {
"type": "object",
"properties": {
"topic": {
"type": "string",
"default": ""
},
"serverUrl": {
"type": "string",
"default": "https://ntfy.sh"
},
"token": {
"type": "string"
}
}
}
},
"required": [
"ntfy"
]
},
{
"type": "object",
"properties": {
"opsgenie": {
"type": "object",
"properties": {
"apiKey": {
"type": "string"
},
"region": {
"type": "string",
"enum": [
"us",
"eu"
]
}
},
"required": [
"apiKey",
"region"
]
}
},
"required": [
"opsgenie"
]
},
{
"type": "object",
"properties": {
"pagerduty": {
"type": "string"
}
},
"required": [
"pagerduty"
]
},
{
"type": "object",
"properties": {
"sms": {
"type": "string",
"pattern": "^([+]?[\\s0-9]+)?(\\d{3}|[(]?[0-9]+[)])?([-]?[\\s]?[0-9])+$"
}
},
"required": [
"sms"
]
},
{
"type": "object",
"properties": {
"telegram": {
"type": "object",
"properties": {
"chatId": {
"type": "string"
}
},
"required": [
"chatId"
]
}
},
"required": [
"telegram"
]
},
{
"type": "object",
"properties": {
"slack": {
"type": "string",
"format": "uri"
}
},
"required": [
"slack"
]
},
{
"type": "object",
"properties": {
"webhook": {
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"format": "uri"
},
"headers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"value": {
"type": "string"
}
},
"required": [
"key",
"value"
]
}
}
},
"required": [
"endpoint"
]
}
},
"required": [
"webhook"
]
},
{
"type": "object",
"properties": {
"whatsapp": {
"type": "string",
"pattern": "^([+]?[\\s0-9]+)?(\\d{3}|[(]?[0-9]+[)])?([-]?[\\s]?[0-9])+$"
}
},
"required": [
"whatsapp"
]
},
{
"type": "object",
"properties": {
"google-chat": {
"type": "string",
"format": "uri"
}
},
"required": [
"google-chat"
]
}
],
"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",
"payload"
]
},
"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"
],
"default": "free",
"description": "The current workspace plan"
}
},
"required": [
"slug"
]
}
},
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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",
"default": "2026-02-12T22:01:46.114Z",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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",
"default": "2026-02-12T22:01:46.114Z",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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",
"default": "2026-02-12T22:01:46.114Z",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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",
"description": "The date the incident was acknowledged"
},
"resolvedAt": {
"type": "string",
"nullable": true,
"format": "date",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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",
"description": "When the maintenance starts"
},
"to": {
"type": "string",
"nullable": true,
"format": "date",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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",
"description": "When the maintenance starts"
},
"to": {
"type": "string",
"nullable": true,
"format": "date",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
},
"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",
"ntfy",
"pagerduty",
"opsgenie",
"slack",
"sms",
"telegram",
"webhook",
"whatsapp"
],
"description": "The provider of the notification",
"example": "discord"
},
"payload": {
"anyOf": [
{
"type": "object",
"properties": {
"discord": {
"type": "string",
"format": "uri"
}
},
"required": [
"discord"
]
},
{
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
}
},
"required": [
"email"
]
},
{
"type": "object",
"properties": {
"grafana-oncall": {
"type": "object",
"properties": {
"webhookUrl": {
"type": "string",
"format": "uri"
}
},
"required": [
"webhookUrl"
]
}
},
"required": [
"grafana-oncall"
]
},
{
"type": "object",
"properties": {
"ms-teams": {
"type": "object",
"properties": {
"webhookUrl": {
"type": "string",
"format": "uri"
}
},
"required": [
"webhookUrl"
]
}
},
"required": [
"ms-teams"
]
},
{
"type": "object",
"properties": {
"ntfy": {
"type": "object",
"properties": {
"topic": {
"type": "string",
"default": ""
},
"serverUrl": {
"type": "string",
"default": "https://ntfy.sh"
},
"token": {
"type": "string"
}
}
}
},
"required": [
"ntfy"
]
},
{
"type": "object",
"properties": {
"opsgenie": {
"type": "object",
"properties": {
"apiKey": {
"type": "string"
},
"region": {
"type": "string",
"enum": [
"us",
"eu"
]
}
},
"required": [
"apiKey",
"region"
]
}
},
"required": [
"opsgenie"
]
},
{
"type": "object",
"properties": {
"pagerduty": {
"type": "string"
}
},
"required": [
"pagerduty"
]
},
{
"type": "object",
"properties": {
"sms": {
"type": "string",
"pattern": "^([+]?[\\s0-9]+)?(\\d{3}|[(]?[0-9]+[)])?([-]?[\\s]?[0-9])+$"
}
},
"required": [
"sms"
]
},
{
"type": "object",
"properties": {
"telegram": {
"type": "object",
"properties": {
"chatId": {
"type": "string"
}
},
"required": [
"chatId"
]
}
},
"required": [
"telegram"
]
},
{
"type": "object",
"properties": {
"slack": {
"type": "string",
"format": "uri"
}
},
"required": [
"slack"
]
},
{
"type": "object",
"properties": {
"webhook": {
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"format": "uri"
},
"headers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"value": {
"type": "string"
}
},
"required": [
"key",
"value"
]
}
}
},
"required": [
"endpoint"
]
}
},
"required": [
"webhook"
]
},
{
"type": "object",
"properties": {
"whatsapp": {
"type": "string",
"pattern": "^([+]?[\\s0-9]+)?(\\d{3}|[(]?[0-9]+[)])?([-]?[\\s]?[0-9])+$"
}
},
"required": [
"whatsapp"
]
},
{
"type": "object",
"properties": {
"google-chat": {
"type": "string",
"format": "uri"
}
},
"required": [
"google-chat"
]
}
],
"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",
"payload"
]
}
}
}
},
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
},
"/whoami": {
"get": {
"tags": [
"whoami"
],
"summary": "Get your informations",
"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"
}
}
}
},
"500": {
"description": "The server has encountered a situation it doesn't know how to handle.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrInternalServerError"
}
}
}
}
}
}
}
}
}