{
  "openapi": "3.1.1",
  "info": {
    "title": "Five More Minutes",
    "description": "Tokens must name `fmm-api` as their audience. If everything 401s after signing in, that mapper is missing in Keycloak.",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "http://api.fivemoreminutes.app/"
    }
  ],
  "paths": {
    "/": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/health": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/me": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/households": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateHousehold"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/household": {
      "put": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HouseholdSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/members": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddChild"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/pairing/requests": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OpenRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/pairing/requests/{id}": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "secret",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/pairing/approve": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Approve"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}": {
      "patch": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RenameDevice"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/agent/wait": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "since",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int64"
            }
          },
          {
            "name": "seconds",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/agent/challenge": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChallengeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/agent/token": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TokenRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/agent/heartbeat": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HeartbeatRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/agent/me": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/policies": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/policies/default": {
      "put": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RulesBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}/policy": {
      "put": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RulesBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}/session": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "patch": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MessageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}/session/extend": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExtendRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}/session/cancel": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}/session/stop": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StopRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}/lockout/lift": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/LiftRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/agent/request": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AskRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}/requests/{requestId}/approve": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "requestId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}/requests/{requestId}/deny": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "requestId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/push-tokens": {
      "put": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnregisterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integration-keys": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/devices/{id}/integration-keys": {
      "post": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateKeyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integration-keys/{keyId}": {
      "delete": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "keyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integration-keys/{keyId}/activity": {
      "get": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "keyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/account": {
      "delete": {
        "tags": [
          "FiveMoreMinutes.Api"
        ],
        "parameters": [
          {
            "name": "confirm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integrations/v1/me": {
      "get": {
        "tags": [
          "Integrations v1"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integrations/v1/state": {
      "get": {
        "tags": [
          "Integrations v1"
        ],
        "parameters": [
          {
            "name": "wait",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integrations/v1/webhook": {
      "get": {
        "tags": [
          "Integrations v1"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "put": {
        "tags": [
          "Integrations v1"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Integrations v1"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integrations/v1/webhook/test": {
      "post": {
        "tags": [
          "Integrations v1"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integrations/v1/timer/start": {
      "post": {
        "tags": [
          "Integrations v1"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integrations/v1/timer/extend": {
      "post": {
        "tags": [
          "Integrations v1"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/ExtendRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integrations/v1/timer/stop": {
      "post": {
        "tags": [
          "Integrations v1"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/integrations/v1/timer/cancel": {
      "post": {
        "tags": [
          "Integrations v1"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AddChild": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          }
        }
      },
      "Approve": {
        "required": [
          "code",
          "memberId"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "memberId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          }
        }
      },
      "AskRequest": {
        "required": [
          "minutes",
          "reason"
        ],
        "type": "object",
        "properties": {
          "minutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "reason": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "ChallengeRequest": {
        "required": [
          "deviceId"
        ],
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "CreateHousehold": {
        "required": [
          "name",
          "timeZoneId",
          "yourName",
          "language"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "timeZoneId": {
            "type": "string"
          },
          "yourName": {
            "type": [
              "null",
              "string"
            ]
          },
          "language": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "CreateKeyRequest": {
        "required": [
          "name",
          "scopes",
          "pluginId",
          "expiresInDays"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "scopes": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "pluginId": {
            "type": [
              "null",
              "string"
            ]
          },
          "expiresInDays": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "ExtendRequest": {
        "required": [
          "minutes"
        ],
        "type": "object",
        "properties": {
          "minutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "HeartbeatRequest": {
        "required": [
          "hostname",
          "agentVersion",
          "activeApp"
        ],
        "type": "object",
        "properties": {
          "hostname": {
            "type": [
              "null",
              "string"
            ]
          },
          "agentVersion": {
            "type": [
              "null",
              "string"
            ]
          },
          "activeApp": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "HouseholdSettings": {
        "required": [
          "name",
          "timeZoneId",
          "language"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "timeZoneId": {
            "type": "string"
          },
          "language": {
            "type": "string"
          }
        }
      },
      "LiftRequest": {
        "required": [
          "pin"
        ],
        "type": "object",
        "properties": {
          "pin": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "MessageRequest": {
        "required": [
          "message"
        ],
        "type": "object",
        "properties": {
          "message": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "OpenRequest": {
        "required": [
          "publicKey",
          "hostname",
          "platform"
        ],
        "type": "object",
        "properties": {
          "publicKey": {
            "type": "string"
          },
          "hostname": {
            "type": "string"
          },
          "platform": {
            "type": "string"
          }
        }
      },
      "RegisterRequest": {
        "required": [
          "token"
        ],
        "type": "object",
        "properties": {
          "token": {
            "type": "string"
          }
        }
      },
      "RenameDevice": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "RulesBody": {
        "required": [
          "allowedMinutes",
          "extendMinutes",
          "lockoutMinutes",
          "enforcement",
          "corner",
          "reasons",
          "requirePin",
          "pin",
          "warnMinutesBefore",
          "warningMessage",
          "selfExtendAllowed",
          "selfExtendMinutes",
          "askMinutesBefore"
        ],
        "type": "object",
        "properties": {
          "allowedMinutes": {
            "type": "array",
            "items": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          "extendMinutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "lockoutMinutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "enforcement": {
            "type": "string"
          },
          "corner": {
            "type": "string"
          },
          "reasons": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "requirePin": {
            "type": "boolean"
          },
          "pin": {
            "type": [
              "null",
              "string"
            ]
          },
          "warnMinutesBefore": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "warningMessage": {
            "type": "string"
          },
          "selfExtendAllowed": {
            "type": "boolean"
          },
          "selfExtendMinutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "askMinutesBefore": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "reminderMinutes": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        }
      },
      "SetRequest": {
        "required": [
          "url",
          "events"
        ],
        "type": "object",
        "properties": {
          "url": {
            "type": [
              "null",
              "string"
            ]
          },
          "events": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "StartRequest": {
        "required": [
          "minutes",
          "until",
          "message"
        ],
        "type": "object",
        "properties": {
          "minutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "until": {
            "type": [
              "null",
              "string"
            ]
          },
          "message": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "StopRequest": {
        "required": [
          "pin"
        ],
        "type": "object",
        "properties": {
          "pin": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "TokenRequest": {
        "required": [
          "deviceId",
          "nonce",
          "signature"
        ],
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string",
            "format": "uuid"
          },
          "nonce": {
            "type": "string"
          },
          "signature": {
            "type": "string"
          }
        }
      },
      "UnregisterRequest": {
        "required": [
          "token"
        ],
        "type": "object",
        "properties": {
          "token": {
            "type": "string"
          }
        }
      }
    },
    "securitySchemes": {
      "keycloak": {
        "type": "oauth2",
        "description": "Keycloak at /realms/fivemoreminutes. Authorization code with PKCE — the same flow the phone uses.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "file:///realms/fivemoreminutes/protocol/openid-connect/auth",
            "tokenUrl": "file:///realms/fivemoreminutes/protocol/openid-connect/token",
            "scopes": {
              "openid": "Who you are",
              "profile": "Your name"
            }
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "FiveMoreMinutes.Api"
    },
    {
      "name": "Integrations v1"
    }
  ]
}