{
	"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": []
					}
				]
			}
		}
	}
}
