Files
kener/openapi.json
2025-01-14 17:57:42 +05:30

1103 lines
25 KiB
JSON

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