{ "info": { "title": "Kener API", "version": "3.0.0", "description": "# Kener Selfhost node js status page\n![Kener](https://kener.ing/newbg.png \"kener\")\nAPI specification for Kener status page and incident management system. This API spec was created using [Frogment](https://www.frogment.app)\n", "contact": { "name": "Raj Nandan Sharma", "email": "rajnandan1@gmail.com", "url": "https://github.com/rajnandan1/kener/issues" }, "license": { "name": "MIT", "url": "https://opensource.org/licenses/MIT" } }, "openapi": "3.0.0", "servers": [ { "url": "https://{host}", "description": "Kener host URL" } ], "tags": [ { "name": "Monitors", "description": "APIs to interact with monitors" }, { "name": "Incidents", "description": "APIs to integrate incidents" } ], "components": { "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT", "description": "enter your api key here" } }, "schemas": { "MonitorStatus": { "type": "object", "description": "Monitor Status", "required": ["status", "latency", "tag"], "properties": { "status": { "type": "string", "example": "UP", "enum": ["UP", "DOWN", "DEGRADED"] }, "latency": { "type": "number", "description": "In seconds", "example": 100 }, "timestampInSeconds": { "type": "integer", "description": "UTC timestamp in seconds", "example": 1731251760 }, "tag": { "type": "string", "example": "earth", "description": "Tag of a monitor" } }, "example": { "status": "UP", "timestampInSeconds": 1731251760, "latency": 100, "tag": "earth" } }, "StatusResponse": { "type": "object", "description": "Status of a monitor given a tag", "properties": { "status": { "type": "string", "example": "UP", "enum": ["UP", "DOWN", "DEGRADED"] }, "uptime": { "type": "string", "example": "100" }, "last_updated_at": { "type": "integer", "example": 1731251760 } }, "example": { "status": "UP", "last_updated_at": 1731251760, "uptime": "100" } }, "Incident": { "type": "object", "description": "body of an incident", "properties": { "start_date_time": { "type": "integer", "description": "UTC timestamp in seconds", "example": 1731901920 }, "end_date_time": { "type": "integer", "description": "UTC timestamp in seconds", "nullable": true, "example": 1704123938 }, "title": { "type": "string", "example": "Outage in mumbai", "description": "title of the incident" }, "created_at": { "type": "string", "example": "2025-01-09 04:12:01", "description": "created at time" }, "updated_at": { "type": "string", "example": "2025-01-09 06:10:00", "description": "updated at time" }, "status": { "type": "string", "example": "OPEN", "description": "delete or not deleted incident", "enum": ["OPEN", "CLOSED"] }, "state": { "type": "string", "description": "the current status of the incident", "example": "INVESTIGATING", "enum": ["INVESTIGATING", "IDENTIFIED", "MONITORING", "RESOLVED"] } }, "example": { "start_date_time": 1731901920, "end_date_time": 1704123938, "title": "title of the incident", "created_at": "2025-01-09 04:12:01", "updated_at": "2025-01-09 04:12:01", "state": "INVESTIGATING", "status": "OPEN", "id": 4 } }, "IncidentResponse": { "description": "Incident response schema", "allOf": [ { "$ref": "#/components/schemas/Incident" } ] }, "Comment": { "type": "object", "description": "Comment of an incident", "properties": { "comment": { "type": "string", "example": "comment 1" }, "commented_at": { "type": "integer", "example": 1736398336 }, "state": { "type": "string", "example": "IDENTIFIED" } }, "example": { "body": "comment 2", "commented_at": 1736398336, "state": "IDENTIFIED" } }, "CommentResponse": { "type": "object", "description": "Comment Response", "properties": { "id": { "type": "integer", "description": "ID of the comment", "example": 60 }, "comment": { "type": "string", "description": "The content of the comment", "example": "Sometimes, you want all the goodness of moment#from but you don't want to have to create two moments, you just want to display a length of time." }, "incident_id": { "type": "integer", "description": "ID of the associated incident", "example": 24 }, "commented_at": { "type": "integer", "description": "Timestamp when the comment was added", "example": 1736398336 }, "created_at": { "type": "string", "format": "date-time", "description": "Timestamp when the comment was created in ISO 8601 format", "example": "2025-01-09 04:52:16" }, "updated_at": { "type": "string", "format": "date-time", "description": "Timestamp when the comment was last updated in ISO 8601 format", "example": "2025-01-09 04:52:16" }, "status": { "type": "string", "description": "Current status of the comment", "example": "ACTIVE" }, "state": { "type": "string", "description": "the current status of the incident", "example": "INVESTIGATING", "enum": ["INVESTIGATING", "IDENTIFIED", "MONITORING", "RESOLVED"] } }, "example": { "id": 60, "comment": "Sometimes, you want all the goodness of moment", "incident_id": 24, "commented_at": 1736398336, "created_at": "2025-01-09 04:52:16", "updated_at": "2025-01-09 04:52:16", "status": "ACTIVE", "state": "MONITORING" } }, "IncidentStatus": { "type": "object", "description": "Status of the incident", "properties": { "isIdentified": { "type": "boolean", "description": "Has the incident been indetified", "example": true }, "isResolved": { "type": "boolean", "description": "has the incident been resolved", "example": true }, "endDatetime": { "type": "integer", "description": "Incident end time", "example": 1731901920 } }, "example": { "isIdentified": true, "isResolved": true, "endDatetime": 1731901920 } }, "IncidentCreateRequest": { "title": "Incident Create Request Body", "type": "object", "description": "body of an incident", "required": ["title", "start_date_time"], "properties": { "start_date_time": { "type": "integer", "description": "UTC timestamp in seconds", "example": 1731901920 }, "title": { "type": "string", "example": "Outage in mumbai", "description": "title of the incident" } }, "example": { "start_date_time": 1731901920, "title": "title of the incident" } } }, "responses": { "Response401": { "description": "Bad API keys response", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string", "description": "Invalid token response", "example": "invalid token" } } }, "example": { "error": "invalid token" } } } }, "Response400": { "description": "bad request", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string", "description": "bad request while calling kener apis", "example": "unknown tags" } } }, "example": { "error": "unknown tags" } } } } }, "examples": { "GetMonitorStatusExample200": { "summary": "response of get status of a monitor", "description": "Some Description", "value": { "status": "UP", "uptime": "100", "lastUpdatedAt": 1731901920 } }, "DegradedRequestBody": { "summary": "update to degraded", "description": "Some Description", "value": { "status": "DEGRADED", "timestampInSeconds": 1731251760, "latency": 100, "tag": "earth" } }, "CreateIncidentResponse": { "summary": "create incident response", "description": "create incident response", "value": { "start_date_time": 1731901920, "end_date_time": 1731901920, "id": 4, "created_at": "2025-01-09 04:12:01", "updated_at": "2025-01-10 04:12:01", "title": "title of the incident", "status": "OPEN", "state": "INVESTIGATING" } }, "CreateIncidentRequest": { "summary": "create incident request body", "description": "create incident request body", "value": { "start_date_time": 1731901920, "title": "title of the incident" } }, "SearchIncidentsResponse": { "summary": "array of incidents", "description": "Some Description", "value": [ { "id": 2, "title": "future wala", "start_date_time": 1736774486, "end_date_time": 1737033787, "created_at": "2025-01-12 13:21:32", "updated_at": "2025-01-12 13:23:15", "status": "OPEN", "state": "RESOLVED" }, { "id": 1, "title": "internatiinal asda", "start_date_time": 1736684329, "end_date_time": null, "created_at": "2025-01-12 12:18:53", "updated_at": "2025-01-12 13:21:32", "status": "OPEN", "state": "INVESTIGATING" } ] }, "CommentsResponse": { "summary": "list of comments", "description": "Some Description", "value": [ { "id": 58, "comment": "idensad", "incident_id": 24, "commented_at": 1736398295, "created_at": "2025-01-09 04:51:37", "updated_at": "2025-01-09 04:51:37", "status": "ACTIVE", "state": "IDENTIFIED" }, { "id": 57, "comment": "Sometimes, you want all the goodness of moment#from but you don't want to have to create two moments, you just want to display a length of time.", "incident_id": 24, "commented_at": 1736398279, "created_at": "2025-01-09 04:51:19", "updated_at": "2025-01-09 04:51:19", "status": "ACTIVE", "state": "INVESTIGATING" } ] }, "CommentRequestBody": { "summary": "request body for a update", "description": "request body for a update to add in an incident", "value": { "comment": "This is a comment", "commented_at": 1736398336, "state": "IDENTIFIED" } }, "CreateCommentResponse": { "summary": "create update response body sample", "description": "create update response body sample", "value": { "id": 60, "comment": "Sometimes, you want all the goodness of moment", "incident_id": 24, "commented_at": 1736398336, "created_at": "2025-01-09 04:52:16", "updated_at": "2025-01-09 04:52:16", "status": "ACTIVE", "state": "MONITORING" } } } }, "paths": { "/api/status": { "post": { "operationId": "updateMonitorStatus", "summary": "Update status of a monitor", "description": "Update status of a monitor at a given timestamp UTC", "tags": ["Monitors"], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "description": "request body to update status of a monitor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MonitorStatus" }, "examples": { "degraded": { "$ref": "#/components/examples/DegradedRequestBody" } } } } }, "responses": { "200": { "description": "Status updated successfully", "content": { "application/json": { "schema": { "type": "object", "properties": { "status": { "type": "integer", "example": 200 }, "message": { "type": "string", "example": "success at 1731251760" } } }, "example": { "status": 200, "message": "success at 1731251760" } } } }, "400": { "$ref": "#/components/responses/Response400" }, "401": { "$ref": "#/components/responses/Response401" } } }, "get": { "operationId": "getMonitorStatus", "summary": "Get status of a monitor", "description": "get status of a monitor at timestamp", "tags": ["Monitors"], "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "tag", "in": "query", "required": true, "description": "monitor tag to get status of it", "schema": { "type": "string", "example": "earth" } } ], "responses": { "200": { "description": "Monitor status retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusResponse" }, "examples": { "successExample": { "$ref": "#/components/examples/GetMonitorStatusExample200" } } } } }, "400": { "$ref": "#/components/responses/Response400" }, "401": { "$ref": "#/components/responses/Response401" } } } }, "/api/incident": { "post": { "operationId": "createIncident", "summary": "Create a new incident", "description": "API to create incidents", "tags": ["Incidents"], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "description": "request body to manually create an incident", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncidentCreateRequest" }, "examples": { "sample": { "$ref": "#/components/examples/CreateIncidentRequest" } } } } }, "responses": { "200": { "description": "Incident created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncidentResponse" }, "examples": { "success": { "$ref": "#/components/examples/CreateIncidentResponse" } } } } }, "400": { "$ref": "#/components/responses/Response400" }, "401": { "$ref": "#/components/responses/Response401" } } }, "get": { "operationId": "searchIncidents", "summary": "Search for incidents", "description": "API to get incidents", "tags": ["Incidents"], "security": [ { "bearerAuth": [] } ], "parameters": [ { "name": "status", "in": "query", "description": "status of the incident. Can be open or close. close means deleted", "schema": { "type": "string", "description": "status of the incident. Can be open or close. close means deleted", "enum": ["OPEN", "CLOSED"], "default": "OPEN", "example": "OPEN" } }, { "name": "state", "in": "query", "description": "state of the incident. Can be open or close", "schema": { "type": "string", "description": "state of the incident. Can be open or close", "enum": ["INVESTIGATING", "IDENTIFIED", "MONITORING", "RESOLVED"], "default": "INVESTIGATING", "example": "IDENTIFIED" } }, { "name": "page", "in": "query", "description": "page number", "schema": { "type": "integer", "description": "page number", "default": 1, "minimum": 1, "example": 1 } }, { "name": "limit", "in": "query", "description": "how many per page", "schema": { "type": "integer", "default": 10, "description": "how many per page", "maximum": 100, "example": 10 } }, { "name": "start_date_time", "description": "start time", "in": "query", "schema": { "type": "integer", "description": "start time", "example": 1731866475 } }, { "name": "end_date_time", "description": "end time", "in": "query", "schema": { "type": "integer", "description": "end time", "example": 1731866475 } } ], "responses": { "200": { "description": "Search results retrieved successfully", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/IncidentResponse" } }, "examples": { "success": { "$ref": "#/components/examples/SearchIncidentsResponse" } } } } }, "400": { "$ref": "#/components/responses/Response400" }, "401": { "$ref": "#/components/responses/Response401" } } } }, "/api/incident/{incident_id}": { "parameters": [ { "name": "incident_id", "in": "path", "required": true, "description": "incident id as an integer to get incident by id", "schema": { "type": "integer", "example": 4 } } ], "get": { "operationId": "getIncident", "summary": "Get an incident by id", "description": "API to get an incident by incident id", "tags": ["Incidents"], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Incident retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncidentResponse" }, "examples": { "success": { "$ref": "#/components/examples/CreateIncidentResponse" } } } } }, "400": { "$ref": "#/components/responses/Response400" }, "401": { "$ref": "#/components/responses/Response401" } } }, "patch": { "operationId": "updateIncident", "summary": "Update an incident", "description": "API to update an incident by incident id", "tags": ["Incidents"], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "description": "search for an incident", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Incident" }, "examples": { "sample": { "$ref": "#/components/examples/CreateIncidentRequest" } } } } }, "responses": { "200": { "description": "Incident updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IncidentResponse" }, "examples": { "success": { "$ref": "#/components/examples/CreateIncidentResponse" } } } } }, "400": { "$ref": "#/components/responses/Response400" }, "401": { "$ref": "#/components/responses/Response401" } } } }, "/api/incident/{incident_id}/updates": { "parameters": [ { "name": "incident_id", "in": "path", "required": true, "description": "incident id to fetch comment for", "schema": { "type": "integer", "example": 4 } } ], "post": { "operationId": "addIncidentComment", "summary": "Add an update to an incident", "description": "API to create update for an incident", "tags": ["Incidents"], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "description": "body to add an update", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Comment" }, "examples": { "sample": { "$ref": "#/components/examples/CommentRequestBody" } } } } }, "responses": { "200": { "description": "Comment added successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommentResponse" }, "examples": { "sample": { "$ref": "#/components/examples/CreateCommentResponse" } } } } }, "400": { "$ref": "#/components/responses/Response400" }, "401": { "$ref": "#/components/responses/Response401" } } }, "get": { "operationId": "getIncidentComments", "summary": "Get updates for an incident", "description": "API to get updates for an incident", "tags": ["Incidents"], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "updates retrieved successfully", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/CommentResponse" } }, "examples": { "success": { "$ref": "#/components/examples/CommentsResponse" } } } } }, "400": { "$ref": "#/components/responses/Response400" }, "401": { "$ref": "#/components/responses/Response401" } } } }, "/api/incident/{incident_id}/monitors": { "parameters": [ { "name": "incident_id", "in": "path", "required": true, "description": "incident id to fetch comment for", "schema": { "type": "integer", "example": 4 } } ], "get": { "summary": "Get monitors for an incident", "operationId": "getIncidentMonitors", "tags": ["Incidents"], "parameters": [ { "name": "incident_id", "in": "path", "required": true, "schema": { "type": "integer" }, "description": "The ID of the incident" } ], "responses": { "200": { "description": "List of monitors for the incident", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object", "properties": { "monitor_tag": { "type": "string", "description": "The tag of the monitor", "example": "earth" }, "monitor_impact": { "type": "string", "description": "The impact status of the monitor", "example": "DOWN" } } } } } } } }, "security": [ { "bearerAuth": [] } ] }, "post": { "summary": "Add a monitor to an incident", "operationId": "addIncidentMonitor", "tags": ["Incidents"], "parameters": [ { "name": "incident_id", "in": "path", "required": true, "schema": { "type": "integer" }, "description": "The ID of the incident" } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "tag": { "type": "string", "description": "The tag for the monitor", "example": "okbookmarks" }, "impact": { "type": "string", "description": "The impact status of the monitor", "example": "DEGRADED" } } } } } }, "responses": { "200": { "description": "Monitor added successfully", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object", "properties": { "monitor_tag": { "type": "string", "description": "The tag of the monitor", "example": "okbookmarks" }, "monitor_impact": { "type": "string", "description": "The impact status of the monitor", "example": "DEGRADED" } } } } } } } }, "security": [ { "bearerAuth": [] } ] }, "delete": { "summary": "Delete a monitor from an incident", "operationId": "deleteIncidentMonitor", "tags": ["Incidents"], "parameters": [ { "name": "incident_id", "in": "path", "required": true, "schema": { "type": "integer" }, "description": "The ID of the incident" }, { "name": "tag", "in": "query", "required": true, "schema": { "type": "string" }, "description": "The tag of the monitor to delete" } ], "responses": { "200": { "description": "Monitor deleted successfully", "content": { "application/json": { "schema": { "type": "object", "properties": { "message": { "type": "string", "description": "Confirmation message", "example": "Monitor deleted successfully" } } } } } } }, "security": [ { "bearerAuth": [] } ] } } } }