mirror of
https://github.com/rajnandan1/kener.git
synced 2026-08-07 07:14:56 +00:00
2506 lines
67 KiB
JSON
2506 lines
67 KiB
JSON
{
|
|
"openapi": "3.1.0",
|
|
"info": {
|
|
"title": "Kener API v4",
|
|
"version": "4.0.0",
|
|
"description": "OpenAPI specification for Kener self-hosted API v4. All endpoints use Bearer authentication unless explicitly public. Example request URL: GET https://your-kener.com/api/v4/pages"
|
|
},
|
|
"servers": [
|
|
{
|
|
"url": "{serverUrl}",
|
|
"variables": {
|
|
"serverUrl": {
|
|
"default": "https://your-kener.com",
|
|
"description": "Base URL for your Kener deployment"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
],
|
|
"tags": [
|
|
{
|
|
"name": "Monitors"
|
|
},
|
|
{
|
|
"name": "Monitor Data"
|
|
},
|
|
{
|
|
"name": "Incidents"
|
|
},
|
|
{
|
|
"name": "Incident Comments"
|
|
},
|
|
{
|
|
"name": "Pages"
|
|
},
|
|
{
|
|
"name": "Site"
|
|
},
|
|
{
|
|
"name": "Maintenances"
|
|
},
|
|
{
|
|
"name": "Maintenance Events"
|
|
}
|
|
],
|
|
"paths": {
|
|
"/api/v4/monitors": {
|
|
"get": {
|
|
"tags": ["Monitors"],
|
|
"operationId": "listMonitors",
|
|
"summary": "List monitors",
|
|
"parameters": [
|
|
{
|
|
"name": "status",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "category_name",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "monitor_type",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "is_hidden",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Monitor list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["monitors"],
|
|
"properties": {
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": ["Monitors"],
|
|
"operationId": "createMonitor",
|
|
"summary": "Create monitor",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateMonitorRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Monitor created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["monitor"],
|
|
"properties": {
|
|
"monitor": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/monitors/{monitor_tag}": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/MonitorTag"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Monitors"],
|
|
"operationId": "getMonitor",
|
|
"summary": "Get monitor",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Monitor",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["monitor"],
|
|
"properties": {
|
|
"monitor": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
},
|
|
"patch": {
|
|
"tags": ["Monitors"],
|
|
"operationId": "updateMonitor",
|
|
"summary": "Update monitor",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateMonitorRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Monitor updated",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["monitor"],
|
|
"properties": {
|
|
"monitor": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": ["Monitors"],
|
|
"operationId": "deleteMonitor",
|
|
"summary": "Delete monitor",
|
|
"description": "Deletes the monitor and everything keyed to its tag: monitoring data, incident/maintenance/page links, alerts, alert configurations, and group memberships (remaining member weights are rebalanced equally). This is irreversible. Scheduled checks stop within seconds.",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Monitor deleted",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MessageResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/monitors/{monitor_tag}/data": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/MonitorTag"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Monitor Data"],
|
|
"operationId": "getMonitorDataRange",
|
|
"summary": "Get monitor data in a time range",
|
|
"description": "Returns monitoring data points for [start_ts, end_ts). Timestamps are normalized to minute boundaries.",
|
|
"parameters": [
|
|
{
|
|
"name": "start_ts",
|
|
"in": "query",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
{
|
|
"name": "end_ts",
|
|
"in": "query",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Data points",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["data"],
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MonitoringDataPoint"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
},
|
|
"patch": {
|
|
"tags": ["Monitor Data"],
|
|
"operationId": "bulkUpdateMonitorData",
|
|
"summary": "Bulk update monitor data over a range",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BulkUpdateMonitorDataRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Range update completed",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["message", "updated_count"],
|
|
"properties": {
|
|
"message": {
|
|
"type": "string"
|
|
},
|
|
"updated_count": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/monitors/{monitor_tag}/data/{timestamp}": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/MonitorTag"
|
|
},
|
|
{
|
|
"$ref": "#/components/parameters/Timestamp"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Monitor Data"],
|
|
"operationId": "getMonitorDataPoint",
|
|
"summary": "Get one monitor data point",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Data point",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["data"],
|
|
"properties": {
|
|
"data": {
|
|
"$ref": "#/components/schemas/MonitoringDataPoint"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
},
|
|
"patch": {
|
|
"tags": ["Monitor Data"],
|
|
"operationId": "upsertMonitorDataPoint",
|
|
"summary": "Upsert one monitor data point",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpsertMonitorDataPointRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Data point upserted",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["data"],
|
|
"properties": {
|
|
"data": {
|
|
"$ref": "#/components/schemas/MonitoringDataPoint"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/incidents": {
|
|
"get": {
|
|
"tags": ["Incidents"],
|
|
"operationId": "listIncidents",
|
|
"summary": "List incidents",
|
|
"parameters": [
|
|
{
|
|
"name": "start_ts",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
{
|
|
"name": "end_ts",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
{
|
|
"name": "monitor_tags",
|
|
"in": "query",
|
|
"description": "Comma-separated monitor tags",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Incident list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["incidents"],
|
|
"properties": {
|
|
"incidents": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Incident"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": ["Incidents"],
|
|
"operationId": "createIncident",
|
|
"summary": "Create incident",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateIncidentRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Incident created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["incident"],
|
|
"properties": {
|
|
"incident": {
|
|
"$ref": "#/components/schemas/Incident"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/incidents/{incident_id}": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/IncidentId"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Incidents"],
|
|
"operationId": "getIncident",
|
|
"summary": "Get incident",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Incident details",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["incident"],
|
|
"properties": {
|
|
"incident": {
|
|
"$ref": "#/components/schemas/Incident"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
},
|
|
"patch": {
|
|
"tags": ["Incidents"],
|
|
"operationId": "updateIncident",
|
|
"summary": "Update incident",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateIncidentRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Incident updated",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["incident"],
|
|
"properties": {
|
|
"incident": {
|
|
"$ref": "#/components/schemas/Incident"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": ["Incidents"],
|
|
"operationId": "deleteIncident",
|
|
"summary": "Delete incident",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Incident deleted",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MessageResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/incidents/{incident_id}/comments": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/IncidentId"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Incident Comments"],
|
|
"operationId": "listIncidentComments",
|
|
"summary": "List incident comments",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Comment list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["comments"],
|
|
"properties": {
|
|
"comments": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/IncidentComment"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": ["Incident Comments"],
|
|
"operationId": "createIncidentComment",
|
|
"summary": "Create incident comment",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateIncidentCommentRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Comment created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["comment"],
|
|
"properties": {
|
|
"comment": {
|
|
"$ref": "#/components/schemas/IncidentComment"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/incidents/{incident_id}/comments/{comment_id}": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/IncidentId"
|
|
},
|
|
{
|
|
"$ref": "#/components/parameters/CommentId"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Incident Comments"],
|
|
"operationId": "getIncidentComment",
|
|
"summary": "Get incident comment",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Comment",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["comment"],
|
|
"properties": {
|
|
"comment": {
|
|
"$ref": "#/components/schemas/IncidentComment"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
},
|
|
"patch": {
|
|
"tags": ["Incident Comments"],
|
|
"operationId": "updateIncidentComment",
|
|
"summary": "Update incident comment",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateIncidentCommentRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Comment updated",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["comment"],
|
|
"properties": {
|
|
"comment": {
|
|
"$ref": "#/components/schemas/IncidentComment"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": ["Incident Comments"],
|
|
"operationId": "deleteIncidentComment",
|
|
"summary": "Delete incident comment",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Comment deleted",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MessageResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/pages": {
|
|
"get": {
|
|
"tags": ["Pages"],
|
|
"operationId": "listPages",
|
|
"summary": "List pages",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Page list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["pages"],
|
|
"properties": {
|
|
"pages": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Page"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": ["Pages"],
|
|
"operationId": "createPage",
|
|
"summary": "Create page",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreatePageRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Page created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["page"],
|
|
"properties": {
|
|
"page": {
|
|
"$ref": "#/components/schemas/Page"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/pages/{page_path}": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/PagePath"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Pages"],
|
|
"operationId": "getPage",
|
|
"summary": "Get page",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Page",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["page"],
|
|
"properties": {
|
|
"page": {
|
|
"$ref": "#/components/schemas/Page"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
},
|
|
"patch": {
|
|
"tags": ["Pages"],
|
|
"operationId": "updatePage",
|
|
"summary": "Update page",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdatePageRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Page updated",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["page"],
|
|
"properties": {
|
|
"page": {
|
|
"$ref": "#/components/schemas/Page"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
},
|
|
"description": "The home page (addressed as `~home`) accepts all fields except `page_path`, which is fixed and returns `400` if changed."
|
|
},
|
|
"delete": {
|
|
"tags": ["Pages"],
|
|
"operationId": "deletePage",
|
|
"summary": "Delete page",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Page deleted",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MessageResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
},
|
|
"description": "The home page (addressed as `~home`) cannot be deleted and returns `400`."
|
|
}
|
|
},
|
|
"/api/v4/site": {
|
|
"get": {
|
|
"tags": ["Site"],
|
|
"operationId": "listSiteConfig",
|
|
"summary": "List site config entries",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Site config",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["site_data"],
|
|
"properties": {
|
|
"site_data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SiteDataEntry"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/site/{config_key}": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/ConfigKey"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Site"],
|
|
"operationId": "getSiteConfig",
|
|
"summary": "Get one site config entry",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Site config entry",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SiteDataEntry"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
},
|
|
"patch": {
|
|
"tags": ["Site"],
|
|
"operationId": "updateSiteConfig",
|
|
"summary": "Update one site config entry",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["value"],
|
|
"properties": {
|
|
"value": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Site config updated",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SiteDataEntry"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/maintenances": {
|
|
"get": {
|
|
"tags": ["Maintenances"],
|
|
"operationId": "listMaintenances",
|
|
"summary": "List maintenances",
|
|
"parameters": [
|
|
{
|
|
"name": "status",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string",
|
|
"enum": ["ACTIVE", "INACTIVE"]
|
|
}
|
|
},
|
|
{
|
|
"name": "monitor_tag",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Maintenance list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["maintenances"],
|
|
"properties": {
|
|
"maintenances": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Maintenance"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": ["Maintenances"],
|
|
"operationId": "createMaintenance",
|
|
"summary": "Create maintenance",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateMaintenanceRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Maintenance created",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["maintenance"],
|
|
"properties": {
|
|
"maintenance": {
|
|
"$ref": "#/components/schemas/Maintenance"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/maintenances/{maintenance_id}": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/MaintenanceId"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Maintenances"],
|
|
"operationId": "getMaintenance",
|
|
"summary": "Get maintenance",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Maintenance",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["maintenance"],
|
|
"properties": {
|
|
"maintenance": {
|
|
"$ref": "#/components/schemas/Maintenance"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
},
|
|
"patch": {
|
|
"tags": ["Maintenances"],
|
|
"operationId": "updateMaintenance",
|
|
"summary": "Update maintenance",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateMaintenanceRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Maintenance updated",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["maintenance"],
|
|
"properties": {
|
|
"maintenance": {
|
|
"$ref": "#/components/schemas/Maintenance"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": ["Maintenances"],
|
|
"operationId": "deleteMaintenance",
|
|
"summary": "Delete maintenance",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Maintenance deleted",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MessageResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/maintenances/events": {
|
|
"get": {
|
|
"tags": ["Maintenance Events"],
|
|
"operationId": "listMaintenanceEvents",
|
|
"summary": "List maintenance events",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"default": 1
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 20
|
|
}
|
|
},
|
|
{
|
|
"name": "monitors",
|
|
"in": "query",
|
|
"description": "Comma-separated monitor tags",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "event_status",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string",
|
|
"enum": ["SCHEDULED", "ONGOING", "COMPLETED", "CANCELLED", "READY"]
|
|
}
|
|
},
|
|
{
|
|
"name": "event_start_date_time",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
{
|
|
"name": "maintenance_id",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Events list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["events", "page", "limit", "total"],
|
|
"properties": {
|
|
"events": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MaintenanceEventDetailed"
|
|
}
|
|
},
|
|
"page": {
|
|
"type": "integer"
|
|
},
|
|
"limit": {
|
|
"type": "integer"
|
|
},
|
|
"total": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/maintenances/{maintenance_id}/events": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/MaintenanceId"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Maintenance Events"],
|
|
"operationId": "listMaintenanceEventsByMaintenance",
|
|
"summary": "List events for one maintenance",
|
|
"parameters": [
|
|
{
|
|
"name": "page",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"default": 1
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 20
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Events list",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["events", "page", "limit"],
|
|
"properties": {
|
|
"events": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MaintenanceEvent"
|
|
}
|
|
},
|
|
"page": {
|
|
"type": "integer"
|
|
},
|
|
"limit": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/v4/maintenances/{maintenance_id}/events/{event_id}": {
|
|
"parameters": [
|
|
{
|
|
"$ref": "#/components/parameters/MaintenanceId"
|
|
},
|
|
{
|
|
"$ref": "#/components/parameters/EventId"
|
|
}
|
|
],
|
|
"get": {
|
|
"tags": ["Maintenance Events"],
|
|
"operationId": "getMaintenanceEvent",
|
|
"summary": "Get one maintenance event",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Event",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["event"],
|
|
"properties": {
|
|
"event": {
|
|
"$ref": "#/components/schemas/MaintenanceEvent"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
},
|
|
"patch": {
|
|
"tags": ["Maintenance Events"],
|
|
"operationId": "updateMaintenanceEvent",
|
|
"summary": "Update one maintenance event",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateMaintenanceEventRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Event updated",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["event"],
|
|
"properties": {
|
|
"event": {
|
|
"$ref": "#/components/schemas/MaintenanceEvent"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"description": "Either edit the event window (start_date_time and end_date_time) or transition its status (COMPLETED or CANCELLED). The two modes cannot be combined in one request."
|
|
},
|
|
"delete": {
|
|
"tags": ["Maintenance Events"],
|
|
"operationId": "deleteMaintenanceEvent",
|
|
"summary": "Delete one maintenance event",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Event deleted",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MessageResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"securitySchemes": {
|
|
"bearerAuth": {
|
|
"type": "http",
|
|
"scheme": "bearer",
|
|
"bearerFormat": "API key"
|
|
}
|
|
},
|
|
"parameters": {
|
|
"MonitorTag": {
|
|
"name": "monitor_tag",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"Timestamp": {
|
|
"name": "timestamp",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"IncidentId": {
|
|
"name": "incident_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"CommentId": {
|
|
"name": "comment_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"PagePath": {
|
|
"name": "page_path",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "The page's path segment. Use the special token `~home` to address the home page, whose stored `page_path` is an empty string and can not appear as a URL segment. No real page can be named `~home` because the path sanitizer strips `~`.",
|
|
"schema": {
|
|
"type": "string"
|
|
},
|
|
"examples": {
|
|
"regular": {
|
|
"value": "services",
|
|
"summary": "A regular page"
|
|
},
|
|
"home": {
|
|
"value": "~home",
|
|
"summary": "The home page (empty page_path)"
|
|
}
|
|
}
|
|
},
|
|
"ConfigKey": {
|
|
"name": "config_key",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"MaintenanceId": {
|
|
"name": "maintenance_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"EventId": {
|
|
"name": "event_id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"BadRequest": {
|
|
"description": "Bad request",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"Unauthorized": {
|
|
"description": "Unauthorized",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
},
|
|
"examples": {
|
|
"missingHeader": {
|
|
"value": {
|
|
"error": {
|
|
"code": "UNAUTHORIZED",
|
|
"message": "Missing or invalid authorization header"
|
|
}
|
|
}
|
|
},
|
|
"invalidToken": {
|
|
"value": {
|
|
"error": {
|
|
"code": "UNAUTHORIZED",
|
|
"message": "Invalid API key"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"NotFound": {
|
|
"description": "Not found",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"InternalServerError": {
|
|
"description": "Internal server error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"schemas": {
|
|
"ErrorResponse": {
|
|
"type": "object",
|
|
"required": ["error"],
|
|
"properties": {
|
|
"error": {
|
|
"type": "object",
|
|
"required": ["code", "message"],
|
|
"properties": {
|
|
"code": {
|
|
"type": "string"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"MessageResponse": {
|
|
"type": "object",
|
|
"required": ["message"],
|
|
"properties": {
|
|
"message": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"Monitor": {
|
|
"type": "object",
|
|
"required": ["tag", "name"],
|
|
"properties": {
|
|
"tag": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"image": {
|
|
"type": "string"
|
|
},
|
|
"cron": {
|
|
"type": "string"
|
|
},
|
|
"default_status": {
|
|
"type": "string",
|
|
"enum": ["UP", "DOWN", "DEGRADED", "MAINTENANCE", "NO_DATA"]
|
|
},
|
|
"status": {
|
|
"type": "string"
|
|
},
|
|
"category_name": {
|
|
"type": "string"
|
|
},
|
|
"monitor_type": {
|
|
"type": "string"
|
|
},
|
|
"type_data": {
|
|
"type": "object",
|
|
"additionalProperties": true
|
|
},
|
|
"include_degraded_in_downtime": {
|
|
"type": "string"
|
|
},
|
|
"is_hidden": {
|
|
"type": "string"
|
|
},
|
|
"monitor_settings_json": {
|
|
"type": "object",
|
|
"additionalProperties": true
|
|
},
|
|
"external_url": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
},
|
|
"CreateMonitorRequest": {
|
|
"type": "object",
|
|
"required": ["tag", "name"],
|
|
"properties": {
|
|
"tag": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"image": {
|
|
"type": "string"
|
|
},
|
|
"cron": {
|
|
"type": "string"
|
|
},
|
|
"default_status": {
|
|
"type": "string"
|
|
},
|
|
"status": {
|
|
"type": "string"
|
|
},
|
|
"category_name": {
|
|
"type": "string"
|
|
},
|
|
"monitor_type": {
|
|
"type": "string"
|
|
},
|
|
"type_data": {
|
|
"type": "object",
|
|
"additionalProperties": true
|
|
},
|
|
"include_degraded_in_downtime": {
|
|
"type": "string"
|
|
},
|
|
"is_hidden": {
|
|
"type": "string"
|
|
},
|
|
"monitor_settings_json": {
|
|
"type": "object",
|
|
"additionalProperties": true
|
|
},
|
|
"external_url": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateMonitorRequest": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"image": {
|
|
"type": "string"
|
|
},
|
|
"cron": {
|
|
"type": "string"
|
|
},
|
|
"default_status": {
|
|
"type": "string"
|
|
},
|
|
"status": {
|
|
"type": "string"
|
|
},
|
|
"category_name": {
|
|
"type": "string"
|
|
},
|
|
"monitor_type": {
|
|
"type": "string"
|
|
},
|
|
"type_data": {
|
|
"oneOf": [
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": true
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"include_degraded_in_downtime": {
|
|
"type": "string"
|
|
},
|
|
"is_hidden": {
|
|
"type": "string"
|
|
},
|
|
"monitor_settings_json": {
|
|
"oneOf": [
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": true
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"external_url": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"MonitoringDataPoint": {
|
|
"type": "object",
|
|
"required": ["monitor_tag", "timestamp", "status", "latency", "type"],
|
|
"properties": {
|
|
"monitor_tag": {
|
|
"type": "string"
|
|
},
|
|
"timestamp": {
|
|
"type": "integer",
|
|
"description": "UTC timestamp in seconds, minute-aligned"
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": ["UP", "DOWN", "DEGRADED"]
|
|
},
|
|
"latency": {
|
|
"type": "number",
|
|
"minimum": 0
|
|
},
|
|
"type": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
},
|
|
"BulkUpdateMonitorDataRequest": {
|
|
"type": "object",
|
|
"required": ["start_ts", "end_ts", "status", "latency"],
|
|
"properties": {
|
|
"start_ts": {
|
|
"type": "integer"
|
|
},
|
|
"end_ts": {
|
|
"type": "integer"
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": ["UP", "DOWN", "DEGRADED"]
|
|
},
|
|
"latency": {
|
|
"type": "number",
|
|
"minimum": 0
|
|
},
|
|
"deviation": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"default": 0
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpsertMonitorDataPointRequest": {
|
|
"type": "object",
|
|
"properties": {
|
|
"status": {
|
|
"type": "string",
|
|
"enum": ["UP", "DOWN", "DEGRADED"]
|
|
},
|
|
"latency": {
|
|
"type": "number",
|
|
"minimum": 0
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"MonitorImpact": {
|
|
"type": "object",
|
|
"required": ["monitor_tag"],
|
|
"properties": {
|
|
"monitor_tag": {
|
|
"type": "string"
|
|
},
|
|
"impact": {
|
|
"type": "string",
|
|
"enum": ["UP", "DOWN", "DEGRADED", "MAINTENANCE"]
|
|
}
|
|
}
|
|
},
|
|
"Incident": {
|
|
"type": "object",
|
|
"required": ["id", "title"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer"
|
|
},
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"start_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"end_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"state": {
|
|
"type": "string"
|
|
},
|
|
"status": {
|
|
"type": "string"
|
|
},
|
|
"incident_type": {
|
|
"type": "string"
|
|
},
|
|
"incident_source": {
|
|
"type": "string"
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MonitorImpact"
|
|
}
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "Absolute URL of the public incident page.",
|
|
"examples": ["https://status.example.com/incidents/12"]
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
},
|
|
"CreateIncidentRequest": {
|
|
"type": "object",
|
|
"required": ["title", "start_date_time"],
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"start_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"end_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MonitorImpact"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateIncidentRequest": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"start_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"end_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MonitorImpact"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"IncidentComment": {
|
|
"type": "object",
|
|
"required": ["id", "incident_id", "comment", "state", "timestamp"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer"
|
|
},
|
|
"incident_id": {
|
|
"type": "integer"
|
|
},
|
|
"comment": {
|
|
"type": "string"
|
|
},
|
|
"state": {
|
|
"type": "string",
|
|
"enum": ["INVESTIGATING", "IDENTIFIED", "MONITORING", "RESOLVED"]
|
|
},
|
|
"timestamp": {
|
|
"type": "integer"
|
|
},
|
|
"status": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
},
|
|
"CreateIncidentCommentRequest": {
|
|
"type": "object",
|
|
"required": ["comment", "state"],
|
|
"properties": {
|
|
"comment": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"state": {
|
|
"type": "string",
|
|
"enum": ["INVESTIGATING", "IDENTIFIED", "MONITORING", "RESOLVED"]
|
|
},
|
|
"timestamp": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateIncidentCommentRequest": {
|
|
"type": "object",
|
|
"properties": {
|
|
"comment": {
|
|
"type": "string"
|
|
},
|
|
"state": {
|
|
"type": "string",
|
|
"enum": ["INVESTIGATING", "IDENTIFIED", "MONITORING", "RESOLVED"]
|
|
},
|
|
"timestamp": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"Page": {
|
|
"type": "object",
|
|
"required": ["page_path", "page_title", "page_header"],
|
|
"properties": {
|
|
"page_path": {
|
|
"type": "string",
|
|
"description": "The page's path segment. The home page renders as the addressable token `~home` (its stored path is empty); its public URL is the site root.",
|
|
"examples": ["services", "~home"]
|
|
},
|
|
"page_title": {
|
|
"type": "string"
|
|
},
|
|
"page_header": {
|
|
"type": "string"
|
|
},
|
|
"page_subheader": {
|
|
"type": "string"
|
|
},
|
|
"page_logo": {
|
|
"type": "string"
|
|
},
|
|
"page_settings": {
|
|
"$ref": "#/components/schemas/PageSettings"
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
},
|
|
"CreatePageRequest": {
|
|
"type": "object",
|
|
"required": ["page_path", "page_title", "page_header"],
|
|
"properties": {
|
|
"page_path": {
|
|
"type": "string",
|
|
"description": "Will be sanitized to lowercase kebab-like single segment"
|
|
},
|
|
"page_title": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"page_header": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"page_subheader": {
|
|
"type": "string"
|
|
},
|
|
"page_logo": {
|
|
"type": "string"
|
|
},
|
|
"page_settings": {
|
|
"$ref": "#/components/schemas/PageSettings"
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdatePageRequest": {
|
|
"type": "object",
|
|
"properties": {
|
|
"page_path": {
|
|
"type": "string",
|
|
"description": "New path for the page, sanitized to a lowercase single segment. For the home page (addressed as `~home`), sending back `~home` is a no-op and any other value returns `400` — its path is fixed."
|
|
},
|
|
"page_title": {
|
|
"type": "string"
|
|
},
|
|
"page_header": {
|
|
"type": "string"
|
|
},
|
|
"page_subheader": {
|
|
"type": "string"
|
|
},
|
|
"page_logo": {
|
|
"type": "string"
|
|
},
|
|
"page_settings": {
|
|
"$ref": "#/components/schemas/PageSettings"
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SiteDataEntry": {
|
|
"type": "object",
|
|
"required": ["key", "value", "data_type"],
|
|
"properties": {
|
|
"key": {
|
|
"type": "string"
|
|
},
|
|
"value": {},
|
|
"data_type": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
},
|
|
"Maintenance": {
|
|
"type": "object",
|
|
"required": ["id", "title", "start_date_time", "rrule", "duration_seconds"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer"
|
|
},
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"start_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"rrule": {
|
|
"type": "string"
|
|
},
|
|
"duration_seconds": {
|
|
"type": "integer",
|
|
"minimum": 1
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": ["ACTIVE", "INACTIVE"]
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MonitorImpact"
|
|
}
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "Absolute URL of the public page for this maintenance. The public /maintenances/{id} route is keyed by maintenance EVENT id by default, so this URL carries ?type=maintenance. Always link via this field; never build links by concatenating `id` onto a path.",
|
|
"examples": ["https://status.example.com/maintenances/4?type=maintenance"]
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
},
|
|
"CreateMaintenanceRequest": {
|
|
"type": "object",
|
|
"required": ["title", "start_date_time", "rrule", "duration_seconds"],
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"start_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"rrule": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "Valid RRULE string"
|
|
},
|
|
"duration_seconds": {
|
|
"type": "integer",
|
|
"minimum": 1
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MonitorImpact"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateMaintenanceRequest": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"start_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"rrule": {
|
|
"type": "string"
|
|
},
|
|
"duration_seconds": {
|
|
"type": "integer",
|
|
"minimum": 1
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": ["ACTIVE", "INACTIVE"]
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MonitorImpact"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"MaintenanceEvent": {
|
|
"type": "object",
|
|
"required": ["id", "maintenance_id", "start_date_time", "end_date_time"],
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer"
|
|
},
|
|
"maintenance_id": {
|
|
"type": "integer"
|
|
},
|
|
"start_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"end_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"event_status": {
|
|
"type": "string",
|
|
"enum": ["SCHEDULED", "ONGOING", "COMPLETED", "CANCELLED", "READY"]
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "Absolute URL of the public page for this maintenance event.",
|
|
"examples": ["https://status.example.com/maintenances/9"]
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
},
|
|
"MaintenanceEventDetailed": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/MaintenanceEvent"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"maintenance": {
|
|
"$ref": "#/components/schemas/Maintenance"
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
}
|
|
]
|
|
},
|
|
"UpdateMaintenanceEventRequest": {
|
|
"description": "Two mutually exclusive modes: edit the event window (both start_date_time and end_date_time required), or transition the event status (status alone). Combining status with time fields returns 400.",
|
|
"oneOf": [
|
|
{
|
|
"title": "Window edit",
|
|
"type": "object",
|
|
"required": ["start_date_time", "end_date_time"],
|
|
"properties": {
|
|
"start_date_time": {
|
|
"type": "integer"
|
|
},
|
|
"end_date_time": {
|
|
"type": "integer",
|
|
"description": "Must be greater than start_date_time"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
{
|
|
"title": "Status transition",
|
|
"type": "object",
|
|
"required": ["status"],
|
|
"properties": {
|
|
"status": {
|
|
"type": "string",
|
|
"enum": ["COMPLETED", "CANCELLED"],
|
|
"description": "Allowed transitions: ONGOING to COMPLETED; SCHEDULED, READY or ONGOING to CANCELLED. Both target statuses are terminal. Transitioning an ONGOING event moves its end_date_time to the moment of the transition; cancelling an event that has not started keeps its planned window. Invalid transitions return 400."
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
]
|
|
},
|
|
"PageSettings": {
|
|
"type": "object",
|
|
"description": "Per-page display configuration. On update, provided fields are deep-merged into the current settings; omitted fields are left untouched.",
|
|
"properties": {
|
|
"incidents": {
|
|
"type": "object",
|
|
"description": "Incident display preferences for this page.",
|
|
"additionalProperties": true
|
|
},
|
|
"include_maintenances": {
|
|
"type": "object",
|
|
"description": "Maintenance display preferences for this page.",
|
|
"additionalProperties": true
|
|
},
|
|
"monitor_status_history_days": {
|
|
"type": "object",
|
|
"description": "Days of status history shown on the page, per device class.",
|
|
"properties": {
|
|
"desktop": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 365,
|
|
"default": 90
|
|
},
|
|
"mobile": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 365,
|
|
"default": 30
|
|
}
|
|
}
|
|
},
|
|
"monitor_layout_style": {
|
|
"type": "string",
|
|
"enum": ["default-list", "default-grid", "compact-list", "compact-grid"],
|
|
"default": "default-list",
|
|
"description": "How monitors are laid out on the status page."
|
|
},
|
|
"meta_page_title": {
|
|
"type": "string",
|
|
"description": "Per-page override for the meta title."
|
|
},
|
|
"meta_page_description": {
|
|
"type": "string",
|
|
"description": "Per-page override for the meta description."
|
|
},
|
|
"social_page_preview_image": {
|
|
"type": "string",
|
|
"description": "Per-page override for the social preview image."
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
}
|
|
}
|
|
}
|
|
}
|