Files
Checkmate/server/openapi.json
T
2025-11-21 23:44:20 +00:00

408 lines
20 KiB
JSON

{
"openapi": "3.0.3",
"info": {
"title": "Checkmate API",
"version": "1.0.0",
"description": "OpenAPI specification for the Checkmate server endpoints (v1)."
},
"servers": [
{ "url": "http://localhost:52345/api/v1", "description": "Local dev" }
],
"security": [ { "cookieAuth": [] } ],
"components": {
"securitySchemes": {
"cookieAuth": {
"type": "apiKey",
"in": "cookie",
"name": "token",
"description": "HTTP-only auth cookie named 'token'. Send automatically by browser on same-origin requests."
}
},
"schemas": {
"Login": {
"type": "object",
"required": ["email", "password"],
"properties": {
"email": { "type": "string", "format": "email" },
"password": { "type": "string", "minLength": 6 }
}
},
"Register": {
"type": "object",
"required": ["email", "firstName", "lastName", "password"],
"properties": {
"email": { "type": "string", "format": "email" },
"firstName": { "type": "string" },
"lastName": { "type": "string" },
"password": { "type": "string", "minLength": 6 }
}
},
"RegisterWithInvite": {
"type": "object",
"properties": {
"firstName": { "type": "string" },
"lastName": { "type": "string" },
"password": { "type": "string", "minLength": 6 },
"confirmPassword": { "type": "string", "minLength": 6 }
}
},
"MonitorCreate": {
"type": "object",
"required": ["type", "url", "name", "n", "interval"],
"properties": {
"type": { "type": "string", "example": "http" },
"url": { "type": "string", "format": "uri" },
"name": { "type": "string" },
"port": { "type": "integer", "minimum": 1, "maximum": 65535 },
"n": { "type": "integer", "minimum": 1, "maximum": 25 },
"notificationChannels": { "type": "array", "items": { "type": "string" } },
"secret": { "type": "string" },
"interval": { "type": "integer", "minimum": 1 }
}
},
"MonitorPatch": {
"type": "object",
"additionalProperties": true
},
"MonitorImport": {
"type": "object",
"required": ["monitors"],
"properties": {
"monitors": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "url", "type", "interval", "n"],
"properties": {
"name": { "type": "string" },
"url": { "type": "string" },
"port": { "type": "integer", "minimum": 1, "maximum": 65535 },
"secret": { "type": "string" },
"type": { "type": "string", "example": "http" },
"interval": { "type": "integer", "minimum": 1 },
"n": { "type": "integer", "minimum": 1 }
},
"additionalProperties": false
},
"minItems": 1
}
}
},
"NotificationChannel": {
"type": "object",
"required": ["name", "type", "config"],
"properties": {
"name": { "type": "string" },
"type": { "type": "string", "enum": ["email", "slack", "discord", "webhook"] },
"config": {
"type": "object",
"properties": {
"url": { "type": "string" },
"emailAddress": { "type": "string", "format": "email" }
}
}
}
},
"StatusPage": {
"type": "object",
"required": ["name", "url", "isPublished"],
"properties": {
"name": { "type": "string" },
"url": { "type": "string" },
"description": { "type": "string" },
"isPublished": { "type": "boolean" },
"monitors": { "type": "array", "items": { "type": "string" } }
}
},
"ProfilePatch": {
"type": "object",
"properties": {
"firstName": { "type": "string" },
"lastName": { "type": "string" },
"password": { "type": "string", "minLength": 6 },
"confirmPassword": { "type": "string", "minLength": 6 }
}
},
"SystemSettings": {
"type": "object",
"properties": {
"systemEmailHost": { "type": "string" },
"systemEmailPort": { "type": "integer" },
"systemEmailAddress": { "type": "string", "format": "email" },
"systemEmailPassword": { "type": "string" },
"systemEmailUser": { "type": "string" },
"systemEmailConnectionHost": { "type": "string" },
"systemEmailTLSServername": { "type": "string" },
"systemEmailSecure": { "type": "boolean" },
"systemEmailPool": { "type": "boolean" },
"systemEmailIgnoreTLS": { "type": "boolean" },
"systemEmailRequireTLS": { "type": "boolean" },
"systemEmailRejectUnauthorized": { "type": "boolean" }
}
},
"RecoveryRequest": {
"type": "object",
"required": ["email"],
"properties": { "email": { "type": "string", "format": "email" } }
},
"ResetPassword": {
"type": "object",
"required": ["token", "password"],
"properties": {
"token": { "type": "string" },
"password": { "type": "string", "minLength": 6 }
}
}
}
},
"paths": {
"/auth/register": {
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Register" } } } },
"responses": { "200": { "description": "Registered" } },
"security": []
}
},
"/auth/register/invite/{token}": {
"post": {
"parameters": [ { "name": "token", "in": "path", "required": true, "schema": { "type": "string" } } ],
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RegisterWithInvite" } } } },
"responses": { "200": { "description": "Registered via invite" } },
"security": []
}
},
"/auth/login": {
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Login" } } } },
"responses": { "200": { "description": "Logged in" } },
"security": []
}
},
"/auth/logout": { "post": { "responses": { "200": { "description": "Logged out" } } } },
"/auth/me": { "get": { "responses": { "200": { "description": "Current user" } } } },
"/auth/cleanup": { "post": { "responses": { "200": { "description": "Cleanup executed" } } } },
"/auth/cleanup-monitors": { "post": { "responses": { "200": { "description": "Monitor cleanup executed" } } } },
"/monitors": {
"get": {
"parameters": [
{ "name": "page", "in": "query", "schema": { "type": "integer", "minimum": 0 } },
{ "name": "rowsPerPage", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100 } },
{ "name": "sortField", "in": "query", "schema": { "type": "string" } },
{ "name": "sortOrder", "in": "query", "schema": { "type": "string", "enum": ["asc", "desc"] } },
{ "name": "type", "in": "query", "schema": { "type": "array", "items": { "type": "string" } }, "style": "form", "explode": true },
{ "name": "status", "in": "query", "schema": { "type": "array", "items": { "type": "string" } }, "style": "form", "explode": true }
],
"responses": { "200": { "description": "List monitors" } }
},
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MonitorCreate" } } } },
"responses": { "200": { "description": "Created monitor" } }
}
},
"/monitors/export": { "get": { "responses": { "200": { "description": "Export monitors (JSON)" } } } },
"/monitors/import": {
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MonitorImport" } } } },
"responses": { "200": { "description": "Import summary" } }
}
},
"/monitors/{id}": {
"get": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Monitor" } } },
"patch": {
"parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ],
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MonitorPatch" } } } },
"responses": { "200": { "description": "Updated" } }
},
"delete": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Deleted" } } }
},
"/monitors/{id}/checks": {
"get": {
"parameters": [
{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } },
{ "name": "page", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 0 } },
{ "name": "rowsPerPage", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1, "maximum": 100 } }
],
"responses": { "200": { "description": "Monitor checks" } }
}
},
"/monitors/{id}/notifications/test": {
"post": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Test sent" } } }
},
"/monitors/{id}/active": {
"patch": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Toggled" } } }
},
"/notification-channels": {
"get": { "responses": { "200": { "description": "List channels" } } },
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationChannel" } } } },
"responses": { "200": { "description": "Created" } }
}
},
"/notification-channels/{id}": {
"get": { "parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Channel" } } },
"patch": {
"parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ],
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationChannel" } } } },
"responses": { "200": { "description": "Updated" } }
},
"delete": { "parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Deleted" } } }
},
"/notification-channels/{id}/active": {
"patch": { "parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Toggled" } } }
},
"/notification-channels/test": {
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationChannel" } } } },
"responses": { "200": { "description": "Test queued" } }
}
},
"/status-pages": {
"get": { "responses": { "200": { "description": "List" } } },
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusPage" } } } },
"responses": { "200": { "description": "Created" } }
}
},
"/status-pages/{id}": {
"get": { "parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Status page" } } },
"patch": {
"parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ],
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusPage" } } } },
"responses": { "200": { "description": "Updated" } }
},
"delete": { "parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Deleted" } } }
},
"/status-pages/public/{url}": {
"get": {
"parameters": [ { "in": "path", "name": "url", "required": true, "schema": { "type": "string" } } ],
"responses": { "200": { "description": "Public status page" } },
"security": []
}
},
"/checks": {
"get": {
"parameters": [
{ "name": "status", "in": "query", "required": true, "schema": { "type": "string" } },
{ "name": "monitorId", "in": "query", "schema": { "type": "string" } },
{ "name": "page", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 0 } },
{ "name": "rowsPerPage", "in": "query", "required": true, "schema": { "type": "integer", "minimum": 1, "maximum": 100 } },
{ "name": "range", "in": "query", "required": true, "schema": { "type": "string" } }
],
"responses": { "200": { "description": "Checks list" } }
}
},
"/incidents": {
"get": {
"parameters": [
{ "name": "resolutionType", "in": "query", "schema": { "type": "string" } },
{ "name": "resolved", "in": "query", "schema": { "type": "boolean" } },
{ "name": "page", "in": "query", "schema": { "type": "integer", "minimum": 0 } },
{ "name": "rowsPerPage", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100 } }
],
"responses": { "200": { "description": "Incidents list" } }
}
},
"/incidents/{id}/resolve": {
"patch": {
"parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ],
"requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } },
"responses": { "200": { "description": "Resolved" } }
}
},
"/invite": {
"get": { "responses": { "200": { "description": "Invites list" } } },
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["email", "teamId", "teamRoleId"], "properties": { "email": { "type": "string", "format": "email" }, "teamId": { "type": "string" }, "teamRoleId": { "type": "string" }, "orgRoleId": { "type": "string" } } } } } },
"responses": { "200": { "description": "Invite created" } }
}
},
"/invite/{id}": {
"get": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Invite" } } },
"delete": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Deleted" } } }
},
"/maintenance": {
"get": { "responses": { "200": { "description": "List windows" } } },
"post": { "responses": { "200": { "description": "Created" } } }
},
"/maintenance/{id}": {
"get": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Window" } } },
"patch": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Updated" } } },
"delete": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Deleted" } } }
},
"/maintenance/{id}/active": { "patch": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Toggled" } } } },
"/profile": {
"get": { "responses": { "200": { "description": "Profile" } } },
"patch": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProfilePatch" } } } },
"responses": { "200": { "description": "Updated" } }
}
},
"/queue/jobs": { "get": { "responses": { "200": { "description": "Jobs" } } } },
"/queue/metrics": { "get": { "responses": { "200": { "description": "Metrics" } } } },
"/queue/flush": { "post": { "responses": { "200": { "description": "Flushed" } } } },
"/recovery": {
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RecoveryRequest" } } } },
"responses": { "200": { "description": "Recovery email sent" } },
"security": []
}
},
"/recovery/reset": {
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ResetPassword" } } } },
"responses": { "200": { "description": "Password reset" } },
"security": []
}
},
"/roles": { "get": { "responses": { "200": { "description": "Roles" } } } },
"/roles/team/{id}": { "get": { "parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Team roles" } } } },
"/roles/{id}": { "get": { "parameters": [ { "in": "path", "name": "id", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Role" } } } },
"/settings": { "get": { "responses": { "200": { "description": "System settings" } } } },
"/settings/email": {
"patch": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SystemSettings" } } } },
"responses": { "200": { "description": "Updated" } }
}
},
"/settings/test-transport": {
"post": {
"requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SystemSettings" } } } },
"responses": { "200": { "description": "Transport test result" } }
}
},
"/teams": {
"get": { "responses": { "200": { "description": "Org teams" } } },
"post": { "responses": { "200": { "description": "Created" } } }
},
"/teams/joined": { "get": { "responses": { "200": { "description": "Joined teams" } } } },
"/teams/{id}": {
"get": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Team" } } },
"patch": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Updated" } } },
"delete": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Deleted" } } }
},
"/team-members": {
"get": { "responses": { "200": { "description": "Team members" } } },
"post": { "responses": { "200": { "description": "Created" } } }
},
"/team-members/{id}": {
"get": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Member" } } },
"patch": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Updated" } } },
"delete": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Deleted" } } }
}
}
}