{
  "schemes": ["https"],
  "swagger": "2.0",
  "info": {
    "description": "Use your Android phone to send and receive SMS messages via a simple programmable API with end-to-end encryption.",
    "title": "httpSMS API Reference",
    "contact": {
      "name": "support@httpsms.com",
      "email": "support@httpsms.com"
    },
    "license": {
      "name": "AGPL-3.0",
      "url": "https://raw.githubusercontent.com/NdoleStudio/http-sms-manager/main/LICENSE"
    },
    "version": "1.0"
  },
  "host": "api.httpsms.com",
  "basePath": "/v1",
  "paths": {
    "/billing/usage": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get the summary of sent and received messages for a user in the current month",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Billing"],
        "summary": "Get Billing Usage.",
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.BillingUsageResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/billing/usage-history": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get billing usage records of sent and received messages for a user in the past. It will be sorted by timestamp in descending order.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Billing"],
        "summary": "Get billing usage history.",
        "parameters": [
          {
            "minimum": 0,
            "type": "integer",
            "description": "number of heartbeats to skip",
            "name": "skip",
            "in": "query"
          },
          {
            "maximum": 100,
            "minimum": 1,
            "type": "integer",
            "description": "number of heartbeats to return",
            "name": "limit",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.BillingUsagesResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/bulk-messages": {
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Sends bulk SMS messages to multiple users based on our [CSV template](https://httpsms.com/templates/httpsms-bulk.csv) or our [Excel template](https://httpsms.com/templates/httpsms-bulk.xlsx).",
        "consumes": ["multipart/form-data"],
        "produces": ["application/json"],
        "tags": ["BulkSMS"],
        "summary": "Store bulk SMS file",
        "parameters": [
          {
            "type": "file",
            "description": "The Excel or CSV file containing the messages to be sent.",
            "name": "document",
            "in": "formData",
            "required": true
          }
        ],
        "responses": {
          "202": {
            "description": "Accepted",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/discord-integrations": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get the discord integrations of a user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["DiscordIntegration"],
        "summary": "Get discord integrations of a user",
        "parameters": [
          {
            "minimum": 0,
            "type": "integer",
            "description": "number of discord integrations to skip",
            "name": "skip",
            "in": "query"
          },
          {
            "type": "string",
            "description": "filter discord integrations containing query",
            "name": "query",
            "in": "query"
          },
          {
            "maximum": 20,
            "minimum": 1,
            "type": "integer",
            "description": "number of discord integrations to return",
            "name": "limit",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.DiscordsResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Store a discord integration for the authenticated user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["DiscordIntegration"],
        "summary": "Store discord integration",
        "parameters": [
          {
            "description": "Payload of the discord integration request",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.DiscordStore"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "Created",
            "schema": {
              "$ref": "#/definitions/responses.DiscordResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/discord-integrations/{discordID}": {
      "put": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Update a discord integration for the currently authenticated user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["DiscordIntegration"],
        "summary": "Update a discord integration",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the discord integration",
            "name": "discordID",
            "in": "path",
            "required": true
          },
          {
            "description": "Payload of discord integration to update",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.DiscordUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.DiscordResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Delete a discord integration for a user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Webhooks"],
        "summary": "Delete discord integration",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the discord integration",
            "name": "discordID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/discord/event": {
      "post": {
        "description": "Publish a discord event to the registered listeners",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Discord"],
        "summary": "Consume a discord event",
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/heartbeats": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get the last time a phone number requested for outstanding messages. It will be sorted by timestamp in descending order.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Heartbeats"],
        "summary": "Get heartbeats of an owner phone number",
        "parameters": [
          {
            "type": "string",
            "default": "+18005550199",
            "description": "the owner's phone number",
            "name": "owner",
            "in": "query",
            "required": true
          },
          {
            "minimum": 0,
            "type": "integer",
            "description": "number of heartbeats to skip",
            "name": "skip",
            "in": "query"
          },
          {
            "type": "string",
            "description": "filter containing query",
            "name": "query",
            "in": "query"
          },
          {
            "maximum": 20,
            "minimum": 1,
            "type": "integer",
            "description": "number of heartbeats to return",
            "name": "limit",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.HeartbeatsResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Store the heartbeat to make notify that a phone number is still active",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Heartbeats"],
        "summary": "Register heartbeat of an owner phone number",
        "parameters": [
          {
            "description": "Payload of the heartbeat request",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.HeartbeatStore"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.HeartbeatResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/integration/3cx/messages": {
      "post": {
        "description": "Sends an SMS message from the 3CX platform",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["3CXIntegration"],
        "summary": "Sends a 3CX SMS message",
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/message-threads": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get list of contacts which a phone number has communicated with (threads). It will be sorted by timestamp in descending order.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["MessageThreads"],
        "summary": "Get message threads for a phone number",
        "parameters": [
          {
            "type": "string",
            "default": "+18005550199",
            "description": "owner phone number",
            "name": "owner",
            "in": "query",
            "required": true
          },
          {
            "minimum": 0,
            "type": "integer",
            "description": "number of messages to skip",
            "name": "skip",
            "in": "query"
          },
          {
            "type": "string",
            "description": "filter message threads containing query",
            "name": "query",
            "in": "query"
          },
          {
            "maximum": 20,
            "minimum": 1,
            "type": "integer",
            "description": "number of messages to return",
            "name": "limit",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.MessageThreadsResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/message-threads/{messageThreadID}": {
      "put": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Updates the details of a message thread",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["MessageThreads"],
        "summary": "Update a message thread",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the message thread",
            "name": "messageThreadID",
            "in": "path",
            "required": true
          },
          {
            "description": "Payload of message thread details to update",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.MessageThreadUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.PhoneResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Delete a message thread from the database and also deletes all the messages in the thread.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["MessageThreads"],
        "summary": "Delete a message thread from the database.",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the message thread",
            "name": "messageThreadID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/responses.NotFound"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/messages": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get list of messages which are sent between 2 phone numbers. It will be sorted by timestamp in descending order.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Get messages which are sent between 2 phone numbers",
        "parameters": [
          {
            "type": "string",
            "default": "+18005550199",
            "description": "the owner's phone number",
            "name": "owner",
            "in": "query",
            "required": true
          },
          {
            "type": "string",
            "default": "+18005550100",
            "description": "the contact's phone number",
            "name": "contact",
            "in": "query",
            "required": true
          },
          {
            "minimum": 0,
            "type": "integer",
            "description": "number of messages to skip",
            "name": "skip",
            "in": "query"
          },
          {
            "type": "string",
            "description": "filter messages containing query",
            "name": "query",
            "in": "query"
          },
          {
            "maximum": 20,
            "minimum": 1,
            "type": "integer",
            "description": "number of messages to return",
            "name": "limit",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.MessagesResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/messages/bulk-send": {
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Add bulk SMS messages to be sent by the android phone",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Send bulk SMS messages",
        "parameters": [
          {
            "description": "Bulk send message request payload",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.MessageBulkSend"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/responses.MessagesResponse"
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/messages/calls/missed": {
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "This endpoint is called by the httpSMS android app to register a missed call event on the mobile phone.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Register a missed call event on the mobile phone",
        "parameters": [
          {
            "description": "Payload of the missed call event.",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.MessageCallMissed"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.MessageResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/responses.NotFound"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/messages/outstanding": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get an outstanding message to be sent by an android phone",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Get an outstanding message",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703cb",
            "description": "The ID of the message",
            "name": "message_id",
            "in": "query",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.MessageResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/messages/receive": {
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Add a new message received from a mobile phone",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Receive a new SMS message from a mobile phone",
        "parameters": [
          {
            "description": "Received message request payload",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.MessageReceive"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.MessageResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/messages/search": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "This returns the list of all messages based on the filter criteria including missed calls",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Search all messages of a user",
        "parameters": [
          {
            "type": "string",
            "description": "Cloudflare turnstile token https://www.cloudflare.com/en-gb/application-services/products/turnstile/",
            "name": "token",
            "in": "header",
            "required": true
          },
          {
            "type": "string",
            "default": "+18005550199,+18005550100",
            "description": "the owner's phone numbers",
            "name": "owners",
            "in": "query",
            "required": true
          },
          {
            "minimum": 0,
            "type": "integer",
            "description": "number of messages to skip",
            "name": "skip",
            "in": "query"
          },
          {
            "type": "string",
            "description": "filter messages containing query",
            "name": "query",
            "in": "query"
          },
          {
            "maximum": 200,
            "minimum": 1,
            "type": "integer",
            "description": "number of messages to return",
            "name": "limit",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.MessagesResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/messages/send": {
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Add a new SMS message to be sent by your Android phone",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Send an SMS message",
        "parameters": [
          {
            "description": "Send message request payload",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.MessageSend"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.MessageResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/messages/{messageID}": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get a message from the database by the message ID.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Get a message from the database.",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the message",
            "name": "messageID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.MessageResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/responses.NotFound"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Delete a message from the database and removes the message content from the list of threads.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Delete a message from the database.",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the message",
            "name": "messageID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/responses.NotFound"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/messages/{messageID}/events": {
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Use this endpoint to send events for a message when it is failed, sent or delivered by the mobile phone.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Messages"],
        "summary": "Upsert an event for a message on the mobile phone",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the message",
            "name": "messageID",
            "in": "path",
            "required": true
          },
          {
            "description": "Payload of the event emitted.",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.MessageEvent"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.MessageResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/responses.NotFound"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/phone-api-keys": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get list phone API keys which a user has registered on the httpSMS application",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["PhoneAPIKeys"],
        "summary": "Get the phone API keys of a user",
        "parameters": [
          {
            "minimum": 0,
            "type": "integer",
            "description": "number of phone api keys to skip",
            "name": "skip",
            "in": "query"
          },
          {
            "type": "string",
            "description": "filter phone api keys with name containing query",
            "name": "query",
            "in": "query"
          },
          {
            "maximum": 100,
            "minimum": 1,
            "type": "integer",
            "description": "number of phone api keys to return",
            "name": "limit",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.PhoneAPIKeysResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Creates a new phone API key which can be used to log in to the httpSMS app on your Android phone",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["PhoneAPIKeys"],
        "summary": "Store phone API key",
        "parameters": [
          {
            "description": "Payload of new phone API key.",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.PhoneAPIKeyStoreRequest"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.PhoneAPIKeyResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/phone-api-keys/{phoneAPIKeyID}": {
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Delete a phone API Key from the database and cannot be used for authentication anymore.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["PhoneAPIKeys"],
        "summary": "Delete a phone API key from the database.",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the phone API key",
            "name": "phoneAPIKeyID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/responses.NotFound"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/phone-api-keys/{phoneAPIKeyID}/phones/{phoneID}": {
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "You will need to login again to the httpSMS app on your Android phone with a new phone API key.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["PhoneAPIKeys"],
        "summary": "Remove the association of a phone from the phone API key.",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the phone API key",
            "name": "phoneAPIKeyID",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the phone",
            "name": "phoneID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/responses.NotFound"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/phones": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get list of phones which a user has registered on the http sms application",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Phones"],
        "summary": "Get phones of a user",
        "parameters": [
          {
            "minimum": 0,
            "type": "integer",
            "description": "number of heartbeats to skip",
            "name": "skip",
            "in": "query"
          },
          {
            "type": "string",
            "description": "filter phones containing query",
            "name": "query",
            "in": "query"
          },
          {
            "maximum": 20,
            "minimum": 1,
            "type": "integer",
            "description": "number of phones to return",
            "name": "limit",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.PhonesResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "put": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Updates properties of a user's phone. If the phone with this number does not exist, a new one will be created. Think of this method like an 'upsert'",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Phones"],
        "summary": "Upsert Phone",
        "parameters": [
          {
            "description": "Payload of new phone number.",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.PhoneUpsert"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.PhoneResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/phones/fcm-token": {
      "put": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Updates the FCM token of a phone. If the phone with this number does not exist, a new one will be created. Think of this method like an 'upsert'",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Phones"],
        "summary": "Upserts the FCM token of a phone",
        "parameters": [
          {
            "description": "Payload of new FCM token.",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.PhoneFCMToken"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.PhoneResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/phones/{phoneID}": {
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Delete a phone that has been sored in the database",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Phones"],
        "summary": "Delete Phone",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the phone",
            "name": "phoneID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/users/me": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get details of the currently authenticated user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Users"],
        "summary": "Get current user",
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.UserResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "put": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Updates the details of the currently authenticated user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Users"],
        "summary": "Update a user",
        "parameters": [
          {
            "description": "Payload of user details to update",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.UserUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.PhoneResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Deletes the currently authenticated user together with all their data.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Users"],
        "summary": "Delete a user",
        "responses": {
          "201": {
            "description": "Created",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/users/subscription": {
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Cancel the subscription of the authenticated user.",
        "produces": ["application/json"],
        "tags": ["Users"],
        "summary": "Cancel the user's subscription",
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/users/subscription-update-url": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Fetches the subscription URL of the authenticated user.",
        "produces": ["application/json"],
        "tags": ["Users"],
        "summary": "Currently authenticated user subscription update URL",
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.OkString"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/users/subscription/invoices/{subscriptionInvoiceID}": {
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Generates a new invoice PDF file for the given subscription payment with given parameters.",
        "consumes": ["application/json"],
        "produces": ["application/pdf"],
        "tags": ["Users"],
        "summary": "Generate a subscription payment invoice",
        "parameters": [
          {
            "description": "Generate subscription payment invoice parameters",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.UserPaymentInvoice"
            }
          },
          {
            "type": "string",
            "description": "ID of the subscription invoice to generate the PDF for",
            "name": "subscriptionInvoiceID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "type": "file"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/users/subscription/payments": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Subscription payments are generated throughout the lifecycle of a subscription, typically there is one at the time of purchase and then one for each renewal.",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Users"],
        "summary": "Get the last 10 subscription payments.",
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.UserSubscriptionPaymentsResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/users/{userID}/api-keys": {
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Rotate the user's API key in case the current API Key is compromised",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Users"],
        "summary": "Rotate the user's API Key",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the user to update",
            "name": "userID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.UserResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/users/{userID}/notifications": {
      "put": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Update the email notification settings for a user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Users"],
        "summary": "Update notification settings",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the user to update",
            "name": "userID",
            "in": "path",
            "required": true
          },
          {
            "description": "User notification details to update",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.UserNotificationUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.UserResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/v1/attachments/{userID}/{messageID}/{attachmentIndex}/{filename}": {
      "get": {
        "description": "Download an MMS attachment by its path components",
        "produces": ["application/octet-stream"],
        "tags": ["Attachments"],
        "summary": "Download a message attachment",
        "parameters": [
          {
            "type": "string",
            "description": "User ID",
            "name": "userID",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "description": "Message ID",
            "name": "messageID",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "description": "Attachment index",
            "name": "attachmentIndex",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "description": "Filename with extension",
            "name": "filename",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "type": "file"
            }
          },
          "404": {
            "description": "Not Found",
            "schema": {
              "$ref": "#/definitions/responses.NotFound"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/webhooks": {
      "get": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Get the webhooks of a user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Webhooks"],
        "summary": "Get webhooks of a user",
        "parameters": [
          {
            "minimum": 0,
            "type": "integer",
            "description": "number of webhooks to skip",
            "name": "skip",
            "in": "query"
          },
          {
            "type": "string",
            "description": "filter webhooks containing query",
            "name": "query",
            "in": "query"
          },
          {
            "maximum": 20,
            "minimum": 1,
            "type": "integer",
            "description": "number of webhooks to return",
            "name": "limit",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.WebhooksResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Store a webhook for the authenticated user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Webhooks"],
        "summary": "Store a webhook",
        "parameters": [
          {
            "description": "Payload of the webhook request",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.WebhookStore"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.WebhookResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    },
    "/webhooks/{webhookID}": {
      "put": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Update a webhook for the currently authenticated user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Webhooks"],
        "summary": "Update a webhook",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the webhook",
            "name": "webhookID",
            "in": "path",
            "required": true
          },
          {
            "description": "Payload of webhook details to update",
            "name": "payload",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/requests.WebhookUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/responses.WebhookResponse"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      },
      "delete": {
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Delete a webhook for a user",
        "consumes": ["application/json"],
        "produces": ["application/json"],
        "tags": ["Webhooks"],
        "summary": "Delete webhook",
        "parameters": [
          {
            "type": "string",
            "default": "32343a19-da5e-4b1b-a767-3298a73703ca",
            "description": "ID of the webhook",
            "name": "webhookID",
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "schema": {
              "$ref": "#/definitions/responses.NoContent"
            }
          },
          "400": {
            "description": "Bad Request",
            "schema": {
              "$ref": "#/definitions/responses.BadRequest"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/responses.Unauthorized"
            }
          },
          "422": {
            "description": "Unprocessable Entity",
            "schema": {
              "$ref": "#/definitions/responses.UnprocessableEntity"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/responses.InternalServerError"
            }
          }
        }
      }
    }
  },
  "definitions": {
    "entities.BillingUsage": {
      "type": "object",
      "required": [
        "created_at",
        "end_timestamp",
        "id",
        "received_messages",
        "sent_messages",
        "start_timestamp",
        "total_cost",
        "updated_at",
        "user_id"
      ],
      "properties": {
        "created_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "end_timestamp": {
          "type": "string",
          "example": "2022-01-31T23:59:59+00:00"
        },
        "id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703cb"
        },
        "received_messages": {
          "type": "integer",
          "example": 465
        },
        "sent_messages": {
          "type": "integer",
          "example": 321
        },
        "start_timestamp": {
          "type": "string",
          "example": "2022-01-01T00:00:00+00:00"
        },
        "total_cost": {
          "type": "integer",
          "example": 0
        },
        "updated_at": {
          "type": "string",
          "example": "2022-06-05T14:26:10.303278+03:00"
        },
        "user_id": {
          "type": "string",
          "example": "WB7DRDWrJZRGbYrv2CKGkqbzvqdC"
        }
      }
    },
    "entities.Discord": {
      "type": "object",
      "required": [
        "created_at",
        "id",
        "incoming_channel_id",
        "name",
        "server_id",
        "updated_at",
        "user_id"
      ],
      "properties": {
        "created_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703cb"
        },
        "incoming_channel_id": {
          "type": "string",
          "example": "1095780203256627291"
        },
        "name": {
          "type": "string",
          "example": "Game Server"
        },
        "server_id": {
          "type": "string",
          "example": "1095778291488653372"
        },
        "updated_at": {
          "type": "string",
          "example": "2022-06-05T14:26:10.303278+03:00"
        },
        "user_id": {
          "type": "string",
          "example": "WB7DRDWrJZRGbYrv2CKGkqbzvqdC"
        }
      }
    },
    "entities.Heartbeat": {
      "type": "object",
      "required": [
        "charging",
        "id",
        "owner",
        "timestamp",
        "user_id",
        "version"
      ],
      "properties": {
        "charging": {
          "type": "boolean",
          "example": true
        },
        "id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703cb"
        },
        "owner": {
          "type": "string",
          "example": "+18005550199"
        },
        "timestamp": {
          "type": "string",
          "example": "2022-06-05T14:26:01.520828+03:00"
        },
        "user_id": {
          "type": "string",
          "example": "WB7DRDWrJZRGbYrv2CKGkqbzvqdC"
        },
        "version": {
          "type": "string",
          "example": "344c10f"
        }
      }
    },
    "entities.Message": {
      "type": "object",
      "required": [
        "attachments",
        "contact",
        "content",
        "created_at",
        "encrypted",
        "id",
        "max_send_attempts",
        "order_timestamp",
        "owner",
        "request_received_at",
        "send_attempt_count",
        "sim",
        "status",
        "type",
        "updated_at",
        "user_id"
      ],
      "properties": {
        "attachments": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "https://example.com/image.jpg",
            "https://example.com/video.mp4"
          ]
        },
        "contact": {
          "type": "string",
          "example": "+18005550100"
        },
        "content": {
          "type": "string",
          "example": "This is a sample text message"
        },
        "created_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "delivered_at": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "encrypted": {
          "type": "boolean",
          "example": false
        },
        "expired_at": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "failed_at": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "failure_reason": {
          "type": "string",
          "example": "UNKNOWN"
        },
        "id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703cb"
        },
        "last_attempted_at": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "max_send_attempts": {
          "type": "integer",
          "example": 1
        },
        "order_timestamp": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "owner": {
          "type": "string",
          "example": "+18005550199"
        },
        "received_at": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "request_id": {
          "type": "string",
          "example": "153554b5-ae44-44a0-8f4f-7bbac5657ad4"
        },
        "request_received_at": {
          "type": "string",
          "example": "2022-06-05T14:26:01.520828+03:00"
        },
        "scheduled_at": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "scheduled_send_time": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "send_attempt_count": {
          "type": "integer",
          "example": 0
        },
        "send_time": {
          "description": "SendDuration is the number of nanoseconds from when the request was received until when the mobile phone send the message",
          "type": "integer",
          "example": 133414
        },
        "sent_at": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "sim": {
          "description": "SIM is the SIM card to use to send the message\n* SMS1: use the SIM card in slot 1\n* SMS2: use the SIM card in slot 2\n* DEFAULT: used the default communication SIM card",
          "allOf": [
            {
              "$ref": "#/definitions/entities.SIM"
            }
          ],
          "example": "DEFAULT"
        },
        "status": {
          "type": "string",
          "example": "pending"
        },
        "type": {
          "type": "string",
          "example": "mobile-terminated"
        },
        "updated_at": {
          "type": "string",
          "example": "2022-06-05T14:26:10.303278+03:00"
        },
        "user_id": {
          "type": "string",
          "example": "WB7DRDWrJZRGbYrv2CKGkqbzvqdC"
        }
      }
    },
    "entities.MessageThread": {
      "type": "object",
      "required": [
        "color",
        "contact",
        "created_at",
        "id",
        "is_archived",
        "last_message_content",
        "last_message_id",
        "order_timestamp",
        "owner",
        "status",
        "updated_at",
        "user_id"
      ],
      "properties": {
        "color": {
          "type": "string",
          "example": "indigo"
        },
        "contact": {
          "type": "string",
          "example": "+18005550100"
        },
        "created_at": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703ca"
        },
        "is_archived": {
          "type": "boolean",
          "example": false
        },
        "last_message_content": {
          "type": "string",
          "example": "This is a sample message content"
        },
        "last_message_id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703ca"
        },
        "order_timestamp": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "owner": {
          "type": "string",
          "example": "+18005550199"
        },
        "status": {
          "type": "string",
          "example": "PENDING"
        },
        "updated_at": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "user_id": {
          "type": "string",
          "example": "WB7DRDWrJZRGbYrv2CKGkqbzvqdC"
        }
      }
    },
    "entities.Phone": {
      "type": "object",
      "required": [
        "created_at",
        "id",
        "max_send_attempts",
        "message_expiration_seconds",
        "messages_per_minute",
        "phone_number",
        "sim",
        "updated_at",
        "user_id"
      ],
      "properties": {
        "created_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "fcm_token": {
          "type": "string",
          "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzd....."
        },
        "id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703cb"
        },
        "max_send_attempts": {
          "description": "MaxSendAttempts determines how many times to retry sending an SMS message",
          "type": "integer",
          "example": 2
        },
        "message_expiration_seconds": {
          "description": "MessageExpirationSeconds is the duration in seconds after sending a message when it is considered to be expired.",
          "type": "integer"
        },
        "messages_per_minute": {
          "type": "integer",
          "example": 1
        },
        "missed_call_auto_reply": {
          "type": "string",
          "example": "This phone cannot receive calls. Please send an SMS instead."
        },
        "phone_number": {
          "type": "string",
          "example": "+18005550199"
        },
        "sim": {
          "$ref": "#/definitions/entities.SIM"
        },
        "updated_at": {
          "type": "string",
          "example": "2022-06-05T14:26:10.303278+03:00"
        },
        "user_id": {
          "type": "string",
          "example": "WB7DRDWrJZRGbYrv2CKGkqbzvqdC"
        }
      }
    },
    "entities.PhoneAPIKey": {
      "type": "object",
      "required": [
        "api_key",
        "created_at",
        "id",
        "name",
        "phone_ids",
        "phone_numbers",
        "updated_at",
        "user_email",
        "user_id"
      ],
      "properties": {
        "api_key": {
          "type": "string",
          "example": "pk_DGW8NwQp7mxKaSZ72Xq9v6xxxxx"
        },
        "created_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703cb"
        },
        "name": {
          "type": "string",
          "example": "Business Phone Key"
        },
        "phone_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "32343a19-da5e-4b1b-a767-3298a73703cb",
            "32343a19-da5e-4b1b-a767-3298a73703cc"
          ]
        },
        "phone_numbers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": ["+18005550199", "+18005550100"]
        },
        "updated_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "user_email": {
          "type": "string",
          "example": "user@gmail.com"
        },
        "user_id": {
          "type": "string",
          "example": "WB7DRDWrJZRGbYrv2CKGkqbzvqdC"
        }
      }
    },
    "entities.SIM": {
      "type": "string",
      "enum": ["SIM1", "SIM2"],
      "x-enum-varnames": ["SIM1", "SIM2"]
    },
    "entities.SubscriptionName": {
      "type": "string",
      "enum": [
        "free",
        "pro-monthly",
        "pro-yearly",
        "ultra-monthly",
        "ultra-yearly",
        "pro-lifetime",
        "20k-monthly",
        "100k-monthly",
        "50k-monthly",
        "200k-monthly",
        "20k-yearly"
      ],
      "x-enum-varnames": [
        "SubscriptionNameFree",
        "SubscriptionNameProMonthly",
        "SubscriptionNameProYearly",
        "SubscriptionNameUltraMonthly",
        "SubscriptionNameUltraYearly",
        "SubscriptionNameProLifetime",
        "SubscriptionName20KMonthly",
        "SubscriptionName100KMonthly",
        "SubscriptionName50KMonthly",
        "SubscriptionName200KMonthly",
        "SubscriptionName20KYearly"
      ]
    },
    "entities.User": {
      "type": "object",
      "required": [
        "api_key",
        "created_at",
        "email",
        "id",
        "notification_heartbeat_enabled",
        "notification_message_status_enabled",
        "notification_newsletter_enabled",
        "notification_webhook_enabled",
        "subscription_id",
        "subscription_name",
        "timezone",
        "updated_at"
      ],
      "properties": {
        "active_phone_id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703cb"
        },
        "api_key": {
          "type": "string",
          "example": "x-api-key"
        },
        "created_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "email": {
          "type": "string",
          "example": "name@email.com"
        },
        "id": {
          "type": "string",
          "example": "WB7DRDWrJZRGbYrv2CKGkqbzvqdC"
        },
        "notification_heartbeat_enabled": {
          "type": "boolean",
          "example": true
        },
        "notification_message_status_enabled": {
          "type": "boolean",
          "example": true
        },
        "notification_newsletter_enabled": {
          "type": "boolean",
          "example": true
        },
        "notification_webhook_enabled": {
          "type": "boolean",
          "example": true
        },
        "subscription_ends_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "subscription_id": {
          "type": "string",
          "example": "8f9c71b8-b84e-4417-8408-a62274f65a08"
        },
        "subscription_name": {
          "allOf": [
            {
              "$ref": "#/definitions/entities.SubscriptionName"
            }
          ],
          "example": "free"
        },
        "subscription_renews_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "subscription_status": {
          "type": "string",
          "example": "on_trial"
        },
        "timezone": {
          "type": "string",
          "example": "Europe/Helsinki"
        },
        "updated_at": {
          "type": "string",
          "example": "2022-06-05T14:26:10.303278+03:00"
        }
      }
    },
    "entities.Webhook": {
      "type": "object",
      "required": [
        "created_at",
        "events",
        "id",
        "phone_numbers",
        "signing_key",
        "updated_at",
        "url",
        "user_id"
      ],
      "properties": {
        "created_at": {
          "type": "string",
          "example": "2022-06-05T14:26:02.302718+03:00"
        },
        "events": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": ["message.phone.received"]
        },
        "id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703cb"
        },
        "phone_numbers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": ["+18005550199", "+18005550100"]
        },
        "signing_key": {
          "type": "string",
          "example": "DGW8NwQp7mxKaSZ72Xq9v67SLqSbWQvckzzmK8D6rvd7NywSEkdMJtuxKyEkYnCY"
        },
        "updated_at": {
          "type": "string",
          "example": "2022-06-05T14:26:10.303278+03:00"
        },
        "url": {
          "type": "string",
          "example": "https://example.com"
        },
        "user_id": {
          "type": "string",
          "example": "WB7DRDWrJZRGbYrv2CKGkqbzvqdC"
        }
      }
    },
    "requests.DiscordStore": {
      "type": "object",
      "required": ["incoming_channel_id", "name", "server_id"],
      "properties": {
        "incoming_channel_id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "server_id": {
          "type": "string"
        }
      }
    },
    "requests.DiscordUpdate": {
      "type": "object",
      "required": ["incoming_channel_id", "name", "server_id"],
      "properties": {
        "incoming_channel_id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "server_id": {
          "type": "string"
        }
      }
    },
    "requests.HeartbeatStore": {
      "type": "object",
      "required": ["charging", "phone_numbers"],
      "properties": {
        "charging": {
          "type": "boolean"
        },
        "phone_numbers": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "requests.MessageAttachment": {
      "type": "object",
      "required": ["content", "content_type", "name"],
      "properties": {
        "content": {
          "description": "Content is the base64-encoded attachment data",
          "type": "string",
          "example": "base64data..."
        },
        "content_type": {
          "description": "ContentType is the MIME type of the attachment",
          "type": "string",
          "example": "image/jpeg"
        },
        "name": {
          "description": "Name is the original filename of the attachment",
          "type": "string",
          "example": "photo.jpg"
        }
      }
    },
    "requests.MessageBulkSend": {
      "type": "object",
      "required": ["content", "from", "to"],
      "properties": {
        "attachments": {
          "description": "Attachments are optional. When you provide a list of attachments, the message will be sent out as an MMS",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "content": {
          "type": "string",
          "example": "This is a sample text message"
        },
        "encrypted": {
          "description": "Encrypted is used to determine if the content is end-to-end encrypted. Make sure to set the encryption key on the httpSMS mobile app",
          "type": "boolean",
          "example": false
        },
        "from": {
          "type": "string",
          "example": "+18005550199"
        },
        "request_id": {
          "description": "RequestID is an optional parameter used to track a request from the client's perspective",
          "type": "string",
          "example": "153554b5-ae44-44a0-8f4f-7bbac5657ad4"
        },
        "to": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": ["+18005550100", "+18005550100"]
        }
      }
    },
    "requests.MessageCallMissed": {
      "type": "object",
      "required": ["from", "sim", "timestamp", "to"],
      "properties": {
        "from": {
          "type": "string",
          "example": "+18005550199"
        },
        "sim": {
          "type": "string",
          "example": "SIM1"
        },
        "timestamp": {
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "to": {
          "type": "string",
          "example": "+18005550100"
        }
      }
    },
    "requests.MessageEvent": {
      "type": "object",
      "required": ["event_name", "reason", "timestamp"],
      "properties": {
        "event_name": {
          "description": "EventName is the type of event\n* SENT: is emitted when a message is sent by the mobile phone\n* FAILED: is event is emitted when the message could not be sent by the mobile phone\n* DELIVERED: is event is emitted when a delivery report has been received by the mobile phone",
          "type": "string",
          "example": "SENT"
        },
        "reason": {
          "description": "Reason is the exact error message in case the event is an error",
          "type": "string"
        },
        "timestamp": {
          "description": "Timestamp is the time when the event was emitted, Please send the timestamp in UTC with as much precision as possible",
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        }
      }
    },
    "requests.MessageReceive": {
      "type": "object",
      "required": ["content", "encrypted", "from", "sim", "timestamp", "to"],
      "properties": {
        "attachments": {
          "description": "Attachments is the list of MMS attachments received with the message",
          "type": "array",
          "items": {
            "$ref": "#/definitions/requests.MessageAttachment"
          }
        },
        "content": {
          "type": "string",
          "example": "This is a sample text message received on a phone"
        },
        "encrypted": {
          "description": "Encrypted is used to determine if the content is end-to-end encrypted. Make sure to set the encryption key on the httpSMS mobile app",
          "type": "boolean",
          "example": false
        },
        "from": {
          "type": "string",
          "example": "+18005550199"
        },
        "sim": {
          "description": "SIM card that received the message",
          "allOf": [
            {
              "$ref": "#/definitions/entities.SIM"
            }
          ],
          "example": "SIM1"
        },
        "timestamp": {
          "description": "Timestamp is the time when the event was emitted, Please send the timestamp in UTC with as much precision as possible",
          "type": "string",
          "example": "2022-06-05T14:26:09.527976+03:00"
        },
        "to": {
          "type": "string",
          "example": "+18005550100"
        }
      }
    },
    "requests.MessageSend": {
      "type": "object",
      "required": ["content", "from", "to"],
      "properties": {
        "attachments": {
          "description": "Attachments are optional. When you provide a list of attachments, the message will be sent out as an MMS",
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "https://example.com/image.jpg",
            "https://example.com/video.mp4"
          ]
        },
        "content": {
          "type": "string",
          "example": "This is a sample text message"
        },
        "encrypted": {
          "description": "Encrypted is an optional parameter used to determine if the content is end-to-end encrypted. Make sure to set the encryption key on the httpSMS mobile app",
          "type": "boolean",
          "example": false
        },
        "from": {
          "type": "string",
          "example": "+18005550199"
        },
        "request_id": {
          "description": "RequestID is an optional parameter used to track a request from the client's perspective",
          "type": "string",
          "example": "153554b5-ae44-44a0-8f4f-7bbac5657ad4"
        },
        "send_at": {
          "description": "SendAt is an optional parameter used to schedule a message to be sent in the future. The time is considered to be in your profile's local timezone and you can queue messages for up to 20 days (480 hours) in the future.",
          "type": "string",
          "example": "2025-12-19T16:39:57-08:00"
        },
        "to": {
          "type": "string",
          "example": "+18005550100"
        }
      }
    },
    "requests.MessageThreadUpdate": {
      "type": "object",
      "required": ["is_archived"],
      "properties": {
        "is_archived": {
          "type": "boolean",
          "example": true
        }
      }
    },
    "requests.PhoneAPIKeyStoreRequest": {
      "type": "object",
      "required": ["name"],
      "properties": {
        "name": {
          "type": "string",
          "example": "My Phone API Key"
        }
      }
    },
    "requests.PhoneFCMToken": {
      "type": "object",
      "required": ["fcm_token", "phone_number", "sim"],
      "properties": {
        "fcm_token": {
          "type": "string",
          "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzd....."
        },
        "phone_number": {
          "type": "string",
          "example": "[+18005550199]"
        },
        "sim": {
          "description": "SIM is the SIM slot of the phone in case the phone has more than 1 SIM slot",
          "type": "string",
          "example": "SIM1"
        }
      }
    },
    "requests.PhoneUpsert": {
      "type": "object",
      "required": [
        "fcm_token",
        "max_send_attempts",
        "message_expiration_seconds",
        "messages_per_minute",
        "missed_call_auto_reply",
        "phone_number",
        "sim"
      ],
      "properties": {
        "fcm_token": {
          "type": "string",
          "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzd....."
        },
        "max_send_attempts": {
          "description": "MaxSendAttempts is the number of attempts when sending an SMS message to handle the case where the phone is offline.",
          "type": "integer",
          "example": 2
        },
        "message_expiration_seconds": {
          "description": "MessageExpirationSeconds is the duration in seconds after sending a message when it is considered to be expired.",
          "type": "integer",
          "example": 12345
        },
        "messages_per_minute": {
          "type": "integer",
          "example": 1
        },
        "missed_call_auto_reply": {
          "type": "string",
          "example": "e.g. This phone cannot receive calls. Please send an SMS instead."
        },
        "phone_number": {
          "type": "string",
          "example": "+18005550199"
        },
        "sim": {
          "description": "SIM is the SIM slot of the phone in case the phone has more than 1 SIM slot",
          "type": "string",
          "example": "SIM1"
        }
      }
    },
    "requests.UserNotificationUpdate": {
      "type": "object",
      "required": [
        "heartbeat_enabled",
        "message_status_enabled",
        "newsletter_enabled",
        "webhook_enabled"
      ],
      "properties": {
        "heartbeat_enabled": {
          "type": "boolean",
          "example": true
        },
        "message_status_enabled": {
          "type": "boolean",
          "example": true
        },
        "newsletter_enabled": {
          "type": "boolean",
          "example": true
        },
        "webhook_enabled": {
          "type": "boolean",
          "example": true
        }
      }
    },
    "requests.UserPaymentInvoice": {
      "type": "object",
      "required": [
        "address",
        "city",
        "country",
        "name",
        "notes",
        "state",
        "zip_code"
      ],
      "properties": {
        "address": {
          "type": "string",
          "example": "221B Baker Street, London"
        },
        "city": {
          "type": "string",
          "example": "Los Angeles"
        },
        "country": {
          "type": "string",
          "example": "US"
        },
        "name": {
          "type": "string",
          "example": "Acme Corp"
        },
        "notes": {
          "type": "string",
          "example": "Thank you for your business!"
        },
        "state": {
          "type": "string",
          "example": "CA"
        },
        "zip_code": {
          "type": "string",
          "example": "9800"
        }
      }
    },
    "requests.UserUpdate": {
      "type": "object",
      "required": ["active_phone_id", "timezone"],
      "properties": {
        "active_phone_id": {
          "type": "string",
          "example": "32343a19-da5e-4b1b-a767-3298a73703cb"
        },
        "timezone": {
          "type": "string",
          "example": "Europe/Helsinki"
        }
      }
    },
    "requests.WebhookStore": {
      "type": "object",
      "required": ["events", "phone_numbers", "signing_key", "url"],
      "properties": {
        "events": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "phone_numbers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": ["+18005550100", "+18005550100"]
        },
        "signing_key": {
          "type": "string"
        },
        "url": {
          "type": "string"
        }
      }
    },
    "requests.WebhookUpdate": {
      "type": "object",
      "required": ["events", "phone_numbers", "signing_key", "url"],
      "properties": {
        "events": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "phone_numbers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": ["+18005550100", "+18005550100"]
        },
        "signing_key": {
          "type": "string"
        },
        "url": {
          "type": "string"
        }
      }
    },
    "responses.BadRequest": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "string",
          "example": "The request body is not a valid JSON string"
        },
        "message": {
          "type": "string",
          "example": "The request isn't properly formed"
        },
        "status": {
          "type": "string",
          "example": "error"
        }
      }
    },
    "responses.BillingUsageResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "$ref": "#/definitions/entities.BillingUsage"
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.BillingUsagesResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/entities.BillingUsage"
          }
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.DiscordResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "$ref": "#/definitions/entities.Discord"
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.DiscordsResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/entities.Discord"
          }
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.HeartbeatResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "$ref": "#/definitions/entities.Heartbeat"
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.HeartbeatsResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/entities.Heartbeat"
          }
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.InternalServerError": {
      "type": "object",
      "required": ["message", "status"],
      "properties": {
        "message": {
          "type": "string",
          "example": "We ran into an internal error while handling the request."
        },
        "status": {
          "type": "string",
          "example": "error"
        }
      }
    },
    "responses.MessageResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "$ref": "#/definitions/entities.Message"
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.MessageThreadsResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/entities.MessageThread"
          }
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.MessagesResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/entities.Message"
          }
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.NoContent": {
      "type": "object",
      "required": ["message", "status"],
      "properties": {
        "message": {
          "type": "string",
          "example": "action performed successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.NotFound": {
      "type": "object",
      "required": ["message", "status"],
      "properties": {
        "message": {
          "type": "string",
          "example": "cannot find message with ID [32343a19-da5e-4b1b-a767-3298a73703ca]"
        },
        "status": {
          "type": "string",
          "example": "error"
        }
      }
    },
    "responses.OkString": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "string"
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.PhoneAPIKeyResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "$ref": "#/definitions/entities.PhoneAPIKey"
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.PhoneAPIKeysResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/entities.PhoneAPIKey"
          }
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.PhoneResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "$ref": "#/definitions/entities.Phone"
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.PhonesResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/entities.Phone"
          }
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.Unauthorized": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "string",
          "example": "Make sure your API key is set in the [X-API-Key] header in the request"
        },
        "message": {
          "type": "string",
          "example": "You are not authorized to carry out this request."
        },
        "status": {
          "type": "string",
          "example": "error"
        }
      }
    },
    "responses.UnprocessableEntity": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "message": {
          "type": "string",
          "example": "validation errors while handling request"
        },
        "status": {
          "type": "string",
          "example": "error"
        }
      }
    },
    "responses.UserResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "$ref": "#/definitions/entities.User"
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.UserSubscriptionPaymentsResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "type": "object",
            "required": ["attributes", "id", "type"],
            "properties": {
              "attributes": {
                "type": "object",
                "required": [
                  "billing_reason",
                  "card_brand",
                  "card_last_four",
                  "created_at",
                  "currency",
                  "currency_rate",
                  "discount_total",
                  "discount_total_formatted",
                  "discount_total_usd",
                  "refunded",
                  "refunded_amount",
                  "refunded_amount_formatted",
                  "refunded_amount_usd",
                  "refunded_at",
                  "status",
                  "status_formatted",
                  "subtotal",
                  "subtotal_formatted",
                  "subtotal_usd",
                  "tax",
                  "tax_formatted",
                  "tax_inclusive",
                  "tax_usd",
                  "total",
                  "total_formatted",
                  "total_usd",
                  "updated_at"
                ],
                "properties": {
                  "billing_reason": {
                    "type": "string"
                  },
                  "card_brand": {
                    "type": "string"
                  },
                  "card_last_four": {
                    "type": "string"
                  },
                  "created_at": {
                    "type": "string"
                  },
                  "currency": {
                    "type": "string"
                  },
                  "currency_rate": {
                    "type": "string"
                  },
                  "discount_total": {
                    "type": "integer"
                  },
                  "discount_total_formatted": {
                    "type": "string"
                  },
                  "discount_total_usd": {
                    "type": "integer"
                  },
                  "refunded": {
                    "type": "boolean"
                  },
                  "refunded_amount": {
                    "type": "integer"
                  },
                  "refunded_amount_formatted": {
                    "type": "string"
                  },
                  "refunded_amount_usd": {
                    "type": "integer"
                  },
                  "refunded_at": {},
                  "status": {
                    "type": "string"
                  },
                  "status_formatted": {
                    "type": "string"
                  },
                  "subtotal": {
                    "type": "integer"
                  },
                  "subtotal_formatted": {
                    "type": "string"
                  },
                  "subtotal_usd": {
                    "type": "integer"
                  },
                  "tax": {
                    "type": "integer"
                  },
                  "tax_formatted": {
                    "type": "string"
                  },
                  "tax_inclusive": {
                    "type": "boolean"
                  },
                  "tax_usd": {
                    "type": "integer"
                  },
                  "total": {
                    "type": "integer"
                  },
                  "total_formatted": {
                    "type": "string"
                  },
                  "total_usd": {
                    "type": "integer"
                  },
                  "updated_at": {
                    "type": "string"
                  }
                }
              },
              "id": {
                "type": "string"
              },
              "type": {
                "type": "string"
              }
            }
          }
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.WebhookResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "$ref": "#/definitions/entities.Webhook"
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    },
    "responses.WebhooksResponse": {
      "type": "object",
      "required": ["data", "message", "status"],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/entities.Webhook"
          }
        },
        "message": {
          "type": "string",
          "example": "Request handled successfully"
        },
        "status": {
          "type": "string",
          "example": "success"
        }
      }
    }
  },
  "securityDefinitions": {
    "ApiKeyAuth": {
      "type": "apiKey",
      "name": "x-api-Key",
      "in": "header"
    }
  }
}
