---
info:
  title: Kener API
  version: 3.0.0
  description: |
    # Kener Selfhost node js status page
    ![Kener](https://kener.ing/newbg.png "kener")
    API specification for Kener status page and incident management system. This API spec was created using [Frogment](https://www.frogment.app)
  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: 
        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: []
