{
    "swagger": "2.0",
    "info": {
        "description": "API for SCN",
        "title": "SimpleCloudNotifier API",
        "contact": {},
        "version": "2.0"
    },
    "host": "scn.blackforestbytes.com",
    "basePath": "/",
    "paths": {
        "/": {
            "post": {
                "description": "All parameter can be set via query-parameter or the json body. Only UserID, UserKey and Title are required",
                "tags": [
                    "External"
                ],
                "summary": "Send a new message",
                "parameters": [
                    {
                        "type": "string",
                        "example": "test",
                        "name": "channel",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "This is a message",
                        "name": "content",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "P3TNH8mvv14fm",
                        "name": "key",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "db8b0e6a-a08c-4646",
                        "name": "msg_id",
                        "in": "query"
                    },
                    {
                        "enum": [
                            0,
                            1,
                            2
                        ],
                        "type": "integer",
                        "example": 1,
                        "name": "priority",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "example-server",
                        "name": "sender_name",
                        "in": "query"
                    },
                    {
                        "type": "number",
                        "example": 1669824037,
                        "name": "timestamp",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "Hello World",
                        "name": "title",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "7725",
                        "name": "user_id",
                        "in": "query"
                    },
                    {
                        "description": " ",
                        "name": "post_body",
                        "in": "body",
                        "schema": {
                            "$ref": "#/definitions/handler.SendMessage.combined"
                        }
                    },
                    {
                        "type": "string",
                        "example": "test",
                        "name": "channel",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "This is a message",
                        "name": "content",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "P3TNH8mvv14fm",
                        "name": "key",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "db8b0e6a-a08c-4646",
                        "name": "msg_id",
                        "in": "formData"
                    },
                    {
                        "enum": [
                            0,
                            1,
                            2
                        ],
                        "type": "integer",
                        "example": 1,
                        "name": "priority",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "example-server",
                        "name": "sender_name",
                        "in": "formData"
                    },
                    {
                        "type": "number",
                        "example": 1669824037,
                        "name": "timestamp",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "Hello World",
                        "name": "title",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "7725",
                        "name": "user_id",
                        "in": "formData"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.SendMessage.response"
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "The user_id was not found or the user_key is wrong",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "403": {
                        "description": "The user has exceeded its daily quota - wait 24 hours or upgrade your account",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "An internal server error occurred - try again later",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/ack.php": {
            "get": {
                "tags": [
                    "API-v1"
                ],
                "summary": "Acknowledge that a message was received",
                "operationId": "compat-ack",
                "deprecated": true,
                "parameters": [
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the message id",
                        "name": "scn_msg_id",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the message id",
                        "name": "scn_msg_id",
                        "in": "formData",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.Ack.response"
                        }
                    },
                    "default": {
                        "description": "",
                        "schema": {
                            "$ref": "#/definitions/ginresp.compatAPIError"
                        }
                    }
                }
            }
        },
        "/api/db-test": {
            "post": {
                "tags": [
                    "Common"
                ],
                "summary": "Check for a working database connection",
                "operationId": "api-common-dbtest",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.DatabaseTest.response"
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/expand.php": {
            "get": {
                "tags": [
                    "API-v1"
                ],
                "summary": "Get a whole (potentially truncated) message",
                "operationId": "compat-expand",
                "deprecated": true,
                "parameters": [
                    {
                        "type": "string",
                        "description": "The user_id",
                        "name": "user_id",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "The user_key",
                        "name": "user_key",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "The message-id",
                        "name": "scn_msg_id",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "The user_id",
                        "name": "user_id",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "The user_key",
                        "name": "user_key",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "The message-id",
                        "name": "scn_msg_id",
                        "in": "formData",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.Expand.response"
                        }
                    },
                    "default": {
                        "description": "",
                        "schema": {
                            "$ref": "#/definitions/ginresp.compatAPIError"
                        }
                    }
                }
            }
        },
        "/api/health": {
            "get": {
                "tags": [
                    "Common"
                ],
                "summary": "Server Health-checks",
                "operationId": "api-common-health",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.Health.response"
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/info.php": {
            "get": {
                "tags": [
                    "API-v1"
                ],
                "summary": "Get information about the current user",
                "operationId": "compat-info",
                "deprecated": true,
                "parameters": [
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "formData",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.Info.response"
                        }
                    },
                    "default": {
                        "description": "",
                        "schema": {
                            "$ref": "#/definitions/ginresp.compatAPIError"
                        }
                    }
                }
            }
        },
        "/api/ping": {
            "get": {
                "tags": [
                    "Common"
                ],
                "summary": "Simple endpoint to test connection (any http method)",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.pingResponse"
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "put": {
                "tags": [
                    "Common"
                ],
                "summary": "Simple endpoint to test connection (any http method)",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.pingResponse"
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "post": {
                "tags": [
                    "Common"
                ],
                "summary": "Simple endpoint to test connection (any http method)",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.pingResponse"
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "delete": {
                "tags": [
                    "Common"
                ],
                "summary": "Simple endpoint to test connection (any http method)",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.pingResponse"
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "patch": {
                "tags": [
                    "Common"
                ],
                "summary": "Simple endpoint to test connection (any http method)",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.pingResponse"
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/register.php": {
            "get": {
                "tags": [
                    "API-v1"
                ],
                "summary": "Register a new account",
                "operationId": "compat-register",
                "deprecated": true,
                "parameters": [
                    {
                        "type": "string",
                        "description": "the (android) fcm token",
                        "name": "fcm_token",
                        "in": "query",
                        "required": true
                    },
                    {
                        "enum": [
                            "true",
                            "false"
                        ],
                        "type": "string",
                        "description": "if the user is a paid account",
                        "name": "pro",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the (android) IAP token",
                        "name": "pro_token",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the (android) fcm token",
                        "name": "fcm_token",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "enum": [
                            "true",
                            "false"
                        ],
                        "type": "string",
                        "description": "if the user is a paid account",
                        "name": "pro",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the (android) IAP token",
                        "name": "pro_token",
                        "in": "formData",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.Register.response"
                        }
                    },
                    "default": {
                        "description": "",
                        "schema": {
                            "$ref": "#/definitions/ginresp.compatAPIError"
                        }
                    }
                }
            }
        },
        "/api/requery.php": {
            "get": {
                "tags": [
                    "API-v1"
                ],
                "summary": "Return all not-acknowledged messages",
                "operationId": "compat-requery",
                "deprecated": true,
                "parameters": [
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "formData",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.Requery.response"
                        }
                    },
                    "default": {
                        "description": "",
                        "schema": {
                            "$ref": "#/definitions/ginresp.compatAPIError"
                        }
                    }
                }
            }
        },
        "/api/sleep/{secs}": {
            "post": {
                "tags": [
                    "Common"
                ],
                "summary": "Return 200 after x seconds",
                "operationId": "api-common-sleep",
                "parameters": [
                    {
                        "type": "number",
                        "description": "sleep delay (in seconds)",
                        "name": "secs",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.Sleep.response"
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/update.php": {
            "get": {
                "tags": [
                    "API-v1"
                ],
                "summary": "Set the fcm-token (android)",
                "operationId": "compat-update",
                "deprecated": true,
                "parameters": [
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the (android) fcm token",
                        "name": "fcm_token",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the (android) fcm token",
                        "name": "fcm_token",
                        "in": "formData",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.Update.response"
                        }
                    },
                    "default": {
                        "description": "",
                        "schema": {
                            "$ref": "#/definitions/ginresp.compatAPIError"
                        }
                    }
                }
            }
        },
        "/api/upgrade.php": {
            "get": {
                "tags": [
                    "API-v1"
                ],
                "summary": "Upgrade a free account to a paid account",
                "operationId": "compat-upgrade",
                "deprecated": true,
                "parameters": [
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "query",
                        "required": true
                    },
                    {
                        "enum": [
                            "true",
                            "false"
                        ],
                        "type": "string",
                        "description": "if the user is a paid account",
                        "name": "pro",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the (android) IAP token",
                        "name": "pro_token",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_id",
                        "name": "user_id",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the user_key",
                        "name": "user_key",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "enum": [
                            "true",
                            "false"
                        ],
                        "type": "string",
                        "description": "if the user is a paid account",
                        "name": "pro",
                        "in": "formData",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "the (android) IAP token",
                        "name": "pro_token",
                        "in": "formData",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.Upgrade.response"
                        }
                    },
                    "default": {
                        "description": "",
                        "schema": {
                            "$ref": "#/definitions/ginresp.compatAPIError"
                        }
                    }
                }
            }
        },
        "/api/v2/messages": {
            "get": {
                "description": "The next_page_token is an opaque token, the special value \"@start\" (or empty-string) is the beginning and \"@end\" is the end\nSimply start the pagination without a next_page_token and get the next page by calling this endpoint with the returned next_page_token of the last query\nIf there are no more entries the token \"@end\" will be returned\nBy default we return long messages with a trimmed body, if trimmed=false is supplied we return full messages (this reduces the max page_size)",
                "tags": [
                    "API-v2"
                ],
                "summary": "List all (subscribed) messages",
                "operationId": "api-messages-list",
                "parameters": [
                    {
                        "type": "string",
                        "name": "filter",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "name": "next_page_token",
                        "in": "query"
                    },
                    {
                        "type": "integer",
                        "name": "page_size",
                        "in": "query"
                    },
                    {
                        "type": "boolean",
                        "description": "TODO more filter (sender-name, channel, timestamps, prio, )",
                        "name": "trimmed",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.ListMessages.response"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/messages/{mid}": {
            "delete": {
                "description": "The user must own the message and request the resource with the ADMIN Key",
                "tags": [
                    "API-v2"
                ],
                "summary": "Delete a single message",
                "operationId": "api-messages-delete",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "MessageID",
                        "name": "mid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.MessageJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "message not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "patch": {
                "description": "The user must either own the message and request the resource with the READ or ADMIN Key\nOr the user must subscribe to the corresponding channel (and be confirmed) and request the resource with the READ or ADMIN Key\nThe returned message is never trimmed",
                "tags": [
                    "API-v2"
                ],
                "summary": "Get a single message (untrimmed)",
                "operationId": "api-messages-get",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "MessageID",
                        "name": "mid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.MessageJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "message not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users": {
            "post": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Create a new user",
                "operationId": "api-user-create",
                "parameters": [
                    {
                        "description": " ",
                        "name": "post_body",
                        "in": "body",
                        "schema": {
                            "$ref": "#/definitions/handler.CreateUser.body"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.UserJSONWithClientsAndKeys"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/:uid/keys": {
            "get": {
                "description": "The request must be done with an ADMIN key, the returned keys are without their token.",
                "tags": [
                    "API-v2"
                ],
                "summary": "List keys of the user",
                "operationId": "api-tokenkeys-list",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.ListUserKeys.response"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "message not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "post": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Create a new key",
                "operationId": "api-tokenkeys-create",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": " ",
                        "name": "post_body",
                        "in": "body",
                        "schema": {
                            "$ref": "#/definitions/handler.CreateUserKey.body"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.KeyTokenJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "message not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/:uid/keys/:kid": {
            "get": {
                "description": "The request must be done with an ADMIN key, the returned key does not include its token.",
                "tags": [
                    "API-v2"
                ],
                "summary": "Get a single key",
                "operationId": "api-tokenkeys-get",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "TokenKeyID",
                        "name": "kid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.KeyTokenJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "message not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "delete": {
                "description": "Cannot be used to delete the key used in the request itself",
                "tags": [
                    "API-v2"
                ],
                "summary": "Delete a key",
                "operationId": "api-tokenkeys-delete",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "TokenKeyID",
                        "name": "kid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.KeyTokenJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "message not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "patch": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Update a key",
                "operationId": "api-tokenkeys-update",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "TokenKeyID",
                        "name": "kid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.KeyTokenJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "message not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/{uid}": {
            "get": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Get a user",
                "operationId": "api-user-get",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.UserJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "user not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "patch": {
                "description": "The body-values are optional, only send the ones you want to update",
                "tags": [
                    "API-v2"
                ],
                "summary": "(Partially) update a user",
                "operationId": "api-user-update",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Change the username (send an empty string to clear it)",
                        "name": "username",
                        "in": "body",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "description": "Send a verification of permium purchase",
                        "name": "pro_token",
                        "in": "body",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "description": "Send `true` to create a new read_key",
                        "name": "read_key",
                        "in": "body",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "description": "Send `true` to create a new send_key",
                        "name": "send_key",
                        "in": "body",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "description": "Send `true` to create a new admin_key",
                        "name": "admin_key",
                        "in": "body",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.UserJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "user not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/{uid}/channels": {
            "get": {
                "description": "The possible values for 'selector' are:\n- \"owned\"          Return all channels of the user\n- \"subscribed\"     Return all channels that the user is subscribing to\n- \"all\"            Return channels that the user owns or is subscribing\n- \"subscribed_any\" Return all channels that the user is subscribing to (even unconfirmed)\n- \"all_any\"        Return channels that the user owns or is subscribing (even unconfirmed)",
                "tags": [
                    "API-v2"
                ],
                "summary": "List channels of a user (subscribed/owned/all)",
                "operationId": "api-channels-list",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "enum": [
                            "owned",
                            "subscribed",
                            "all",
                            "subscribed_any",
                            "all_any"
                        ],
                        "type": "string",
                        "description": "Filter channels (default: owned)",
                        "name": "selector",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.ListChannels.response"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "post": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Create a new (empty) channel",
                "operationId": "api-channels-create",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": " ",
                        "name": "post_body",
                        "in": "body",
                        "schema": {
                            "$ref": "#/definitions/handler.CreateChannel.body"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.ChannelWithSubscriptionJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "409": {
                        "description": "channel already exists",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/{uid}/channels/{cid}": {
            "get": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Get a single channel",
                "operationId": "api-channels-get",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "ChannelID",
                        "name": "cid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.ChannelWithSubscriptionJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "channel not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "patch": {
                "tags": [
                    "API-v2"
                ],
                "summary": "(Partially) update a channel",
                "operationId": "api-channels-update",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "ChannelID",
                        "name": "cid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Send `true` to create a new subscribe_key",
                        "name": "subscribe_key",
                        "in": "body",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "description": "Send `true` to create a new send_key",
                        "name": "send_key",
                        "in": "body",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "description": "Change the cahnnel display-name (only chnages to lowercase/uppercase are allowed - internal_name must stay the same)",
                        "name": "display_name",
                        "in": "body",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.ChannelWithSubscriptionJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "channel not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/{uid}/channels/{cid}/messages": {
            "get": {
                "description": "The next_page_token is an opaque token, the special value \"@start\" (or empty-string) is the beginning and \"@end\" is the end\nSimply start the pagination without a next_page_token and get the next page by calling this endpoint with the returned next_page_token of the last query\nIf there are no more entries the token \"@end\" will be returned\nBy default we return long messages with a trimmed body, if trimmed=false is supplied we return full messages (this reduces the max page_size)",
                "tags": [
                    "API-v2"
                ],
                "summary": "List messages of a channel",
                "operationId": "api-channel-messages",
                "parameters": [
                    {
                        "type": "string",
                        "name": "filter",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "name": "next_page_token",
                        "in": "query"
                    },
                    {
                        "type": "integer",
                        "name": "page_size",
                        "in": "query"
                    },
                    {
                        "type": "boolean",
                        "name": "trimmed",
                        "in": "query"
                    },
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "ChannelID",
                        "name": "cid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.ListChannelMessages.response"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "channel not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/{uid}/channels/{cid}/subscriptions": {
            "get": {
                "tags": [
                    "API-v2"
                ],
                "summary": "List all subscriptions of a channel",
                "operationId": "api-chan-subscriptions-list",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "ChannelID",
                        "name": "cid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.ListChannelSubscriptions.response"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "channel not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/{uid}/clients": {
            "get": {
                "tags": [
                    "API-v2"
                ],
                "summary": "List all clients",
                "operationId": "api-clients-list",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.ListClients.response"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "post": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Add a new clients",
                "operationId": "api-clients-create",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": " ",
                        "name": "post_body",
                        "in": "body",
                        "schema": {
                            "$ref": "#/definitions/handler.AddClient.body"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.ClientJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/{uid}/clients/{cid}": {
            "get": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Get a single client",
                "operationId": "api-clients-get",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "ClientID",
                        "name": "cid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.ClientJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "client not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "delete": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Delete a client",
                "operationId": "api-clients-delete",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "ClientID",
                        "name": "cid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.ClientJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "client not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/{uid}/subscriptions": {
            "get": {
                "description": "The possible values for 'selector' are:\n- \"outgoing_all\"         All subscriptions (confirmed/unconfirmed) with the user as subscriber (= subscriptions he can use to read channels)\n- \"outgoing_confirmed\"   Confirmed subscriptions with the user as subscriber\n- \"outgoing_unconfirmed\" Unconfirmed (Pending) subscriptions with the user as subscriber\n- \"incoming_all\"         All subscriptions (confirmed/unconfirmed) from other users to channels of this user (= incoming subscriptions and subscription requests)\n- \"incoming_confirmed\"   Confirmed subscriptions from other users to channels of this user\n- \"incoming_unconfirmed\" Unconfirmed subscriptions from other users to channels of this user (= requests)",
                "tags": [
                    "API-v2"
                ],
                "summary": "List all subscriptions of a user (incoming/owned)",
                "operationId": "api-user-subscriptions-list",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "enum": [
                            "outgoing_all",
                            "outgoing_confirmed",
                            "outgoing_unconfirmed",
                            "incoming_all",
                            "incoming_confirmed",
                            "incoming_unconfirmed"
                        ],
                        "type": "string",
                        "description": "Filter subscriptions (default: owner_all)",
                        "name": "selector",
                        "in": "query",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.ListUserSubscriptions.response"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "post": {
                "description": "Either [channel_owner_user_id, channel_internal_name] or [channel_id] must be supplied in the request body",
                "tags": [
                    "API-v2"
                ],
                "summary": "Create/Request a subscription",
                "operationId": "api-subscriptions-create",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "name": "chan_subscribe_key",
                        "in": "query"
                    },
                    {
                        "description": " ",
                        "name": "post_data",
                        "in": "body",
                        "schema": {
                            "$ref": "#/definitions/handler.CreateSubscription.body"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.SubscriptionJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/api/v2/users/{uid}/subscriptions/{sid}": {
            "get": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Get a single subscription",
                "operationId": "api-subscriptions-get",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "SubscriptionID",
                        "name": "sid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.SubscriptionJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "subscription not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "delete": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Cancel (delete) subscription",
                "operationId": "api-subscriptions-delete",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "SubscriptionID",
                        "name": "sid",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.SubscriptionJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "subscription not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            },
            "patch": {
                "tags": [
                    "API-v2"
                ],
                "summary": "Update a subscription (e.g. confirm)",
                "operationId": "api-subscriptions-update",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "UserID",
                        "name": "uid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "SubscriptionID",
                        "name": "sid",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": " ",
                        "name": "post_data",
                        "in": "body",
                        "schema": {
                            "$ref": "#/definitions/handler.UpdateSubscription.body"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.SubscriptionJSON"
                        }
                    },
                    "400": {
                        "description": "supplied values/parameters cannot be parsed / are invalid",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "user is not authorized / has missing permissions",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "404": {
                        "description": "subscription not found",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "internal server error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/send": {
            "post": {
                "description": "All parameter can be set via query-parameter or the json body. Only UserID, UserKey and Title are required",
                "tags": [
                    "External"
                ],
                "summary": "Send a new message",
                "parameters": [
                    {
                        "type": "string",
                        "example": "test",
                        "name": "channel",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "This is a message",
                        "name": "content",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "P3TNH8mvv14fm",
                        "name": "key",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "db8b0e6a-a08c-4646",
                        "name": "msg_id",
                        "in": "query"
                    },
                    {
                        "enum": [
                            0,
                            1,
                            2
                        ],
                        "type": "integer",
                        "example": 1,
                        "name": "priority",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "example-server",
                        "name": "sender_name",
                        "in": "query"
                    },
                    {
                        "type": "number",
                        "example": 1669824037,
                        "name": "timestamp",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "Hello World",
                        "name": "title",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "example": "7725",
                        "name": "user_id",
                        "in": "query"
                    },
                    {
                        "description": " ",
                        "name": "post_body",
                        "in": "body",
                        "schema": {
                            "$ref": "#/definitions/handler.SendMessage.combined"
                        }
                    },
                    {
                        "type": "string",
                        "example": "test",
                        "name": "channel",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "This is a message",
                        "name": "content",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "P3TNH8mvv14fm",
                        "name": "key",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "db8b0e6a-a08c-4646",
                        "name": "msg_id",
                        "in": "formData"
                    },
                    {
                        "enum": [
                            0,
                            1,
                            2
                        ],
                        "type": "integer",
                        "example": 1,
                        "name": "priority",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "example-server",
                        "name": "sender_name",
                        "in": "formData"
                    },
                    {
                        "type": "number",
                        "example": 1669824037,
                        "name": "timestamp",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "Hello World",
                        "name": "title",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "example": "7725",
                        "name": "user_id",
                        "in": "formData"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.SendMessage.response"
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "The user_id was not found or the user_key is wrong",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "403": {
                        "description": "The user has exceeded its daily quota - wait 24 hours or upgrade your account",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "An internal server error occurred - try again later",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        },
        "/send.php": {
            "post": {
                "description": "All parameter can be set via query-parameter or form-data body. Only UserID, UserKey and Title are required",
                "tags": [
                    "External"
                ],
                "summary": "Send a new message (compatibility)",
                "deprecated": true,
                "parameters": [
                    {
                        "type": "string",
                        "name": "content",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "name": "msg_id",
                        "in": "query"
                    },
                    {
                        "type": "integer",
                        "name": "priority",
                        "in": "query"
                    },
                    {
                        "type": "number",
                        "name": "timestamp",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "name": "title",
                        "in": "query"
                    },
                    {
                        "type": "integer",
                        "name": "user_id",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "name": "user_key",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "name": "content",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "name": "msg_id",
                        "in": "formData"
                    },
                    {
                        "type": "integer",
                        "name": "priority",
                        "in": "formData"
                    },
                    {
                        "type": "number",
                        "name": "timestamp",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "name": "title",
                        "in": "formData"
                    },
                    {
                        "type": "integer",
                        "name": "user_id",
                        "in": "formData"
                    },
                    {
                        "type": "string",
                        "name": "user_key",
                        "in": "formData"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/handler.SendMessageCompat.response"
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "403": {
                        "description": "Forbidden",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "schema": {
                            "$ref": "#/definitions/ginresp.apiError"
                        }
                    }
                }
            }
        }
    },
    "definitions": {
        "apierr.APIError": {
            "type": "integer",
            "enum": [
                -1,
                0,
                1101,
                1102,
                1103,
                1104,
                1105,
                1106,
                1121,
                1151,
                1152,
                1153,
                1161,
                1171,
                1201,
                1202,
                1203,
                1204,
                1205,
                1206,
                1207,
                1208,
                1251,
                1301,
                1302,
                1303,
                1304,
                1305,
                1306,
                1307,
                1311,
                1401,
                1501,
                1511,
                2101,
                3001,
                3002,
                9901,
                9902,
                9903,
                9904,
                9905
            ],
            "x-enum-varnames": [
                "UNDEFINED",
                "NO_ERROR",
                "MISSING_UID",
                "MISSING_TOK",
                "MISSING_TITLE",
                "INVALID_PRIO",
                "REQ_METHOD",
                "INVALID_CLIENTTYPE",
                "PAGETOKEN_ERROR",
                "BINDFAIL_QUERY_PARAM",
                "BINDFAIL_BODY_PARAM",
                "BINDFAIL_URI_PARAM",
                "INVALID_BODY_PARAM",
                "INVALID_ENUM_VALUE",
                "NO_TITLE",
                "TITLE_TOO_LONG",
                "CONTENT_TOO_LONG",
                "USR_MSG_ID_TOO_LONG",
                "TIMESTAMP_OUT_OF_RANGE",
                "SENDERNAME_TOO_LONG",
                "CHANNEL_TOO_LONG",
                "CHANNEL_DESCRIPTION_TOO_LONG",
                "CHANNEL_NAME_WOULD_CHANGE",
                "USER_NOT_FOUND",
                "CLIENT_NOT_FOUND",
                "CHANNEL_NOT_FOUND",
                "SUBSCRIPTION_NOT_FOUND",
                "MESSAGE_NOT_FOUND",
                "SUBSCRIPTION_USER_MISMATCH",
                "KEY_NOT_FOUND",
                "USER_AUTH_FAILED",
                "NO_DEVICE_LINKED",
                "CHANNEL_ALREADY_EXISTS",
                "CANNOT_SELFDELETE_KEY",
                "QUOTA_REACHED",
                "FAILED_VERIFY_PRO_TOKEN",
                "INVALID_PRO_TOKEN",
                "FIREBASE_COM_FAILED",
                "FIREBASE_COM_ERRORED",
                "INTERNAL_EXCEPTION",
                "PANIC",
                "NOT_IMPLEMENTED"
            ]
        },
        "ginresp.apiError": {
            "type": "object",
            "properties": {
                "errhighlight": {
                    "type": "integer"
                },
                "error": {
                    "type": "integer"
                },
                "message": {
                    "type": "string"
                },
                "success": {
                    "type": "boolean"
                }
            }
        },
        "ginresp.compatAPIError": {
            "type": "object",
            "properties": {
                "errid": {
                    "type": "integer"
                },
                "message": {
                    "type": "string"
                },
                "success": {
                    "type": "boolean"
                }
            }
        },
        "handler.Ack.response": {
            "type": "object",
            "properties": {
                "message": {
                    "type": "string"
                },
                "new_ack": {
                    "type": "integer"
                },
                "prev_ack": {
                    "type": "integer"
                },
                "success": {
                    "type": "boolean"
                }
            }
        },
        "handler.AddClient.body": {
            "type": "object",
            "required": [
                "agent_model",
                "agent_version",
                "client_type",
                "fcm_token"
            ],
            "properties": {
                "agent_model": {
                    "type": "string"
                },
                "agent_version": {
                    "type": "string"
                },
                "client_type": {
                    "type": "string"
                },
                "fcm_token": {
                    "type": "string"
                }
            }
        },
        "handler.CreateChannel.body": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string"
                },
                "subscribe": {
                    "type": "boolean"
                }
            }
        },
        "handler.CreateSubscription.body": {
            "type": "object",
            "properties": {
                "channel_id": {
                    "type": "string"
                },
                "channel_internal_name": {
                    "type": "string"
                },
                "channel_owner_user_id": {
                    "type": "string"
                }
            }
        },
        "handler.CreateUser.body": {
            "type": "object",
            "properties": {
                "agent_model": {
                    "type": "string"
                },
                "agent_version": {
                    "type": "string"
                },
                "client_type": {
                    "type": "string"
                },
                "fcm_token": {
                    "type": "string"
                },
                "no_client": {
                    "type": "boolean"
                },
                "pro_token": {
                    "type": "string"
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "handler.CreateUserKey.body": {
            "type": "object",
            "required": [
                "all_channels",
                "channels",
                "name",
                "permissions"
            ],
            "properties": {
                "all_channels": {
                    "type": "boolean"
                },
                "channels": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "name": {
                    "type": "string"
                },
                "permissions": {
                    "type": "string"
                }
            }
        },
        "handler.DatabaseTest.response": {
            "type": "object",
            "properties": {
                "libVersion": {
                    "type": "string"
                },
                "libVersionNumber": {
                    "type": "integer"
                },
                "sourceID": {
                    "type": "string"
                },
                "success": {
                    "type": "boolean"
                }
            }
        },
        "handler.Expand.response": {
            "type": "object",
            "properties": {
                "data": {
                    "$ref": "#/definitions/models.CompatMessage"
                },
                "message": {
                    "type": "string"
                },
                "success": {
                    "type": "boolean"
                }
            }
        },
        "handler.Health.response": {
            "type": "object",
            "properties": {
                "status": {
                    "type": "string"
                }
            }
        },
        "handler.Info.response": {
            "type": "object",
            "properties": {
                "fcm_token_set": {
                    "type": "boolean"
                },
                "is_pro": {
                    "type": "integer"
                },
                "message": {
                    "type": "string"
                },
                "quota": {
                    "type": "integer"
                },
                "quota_max": {
                    "type": "integer"
                },
                "success": {
                    "type": "boolean"
                },
                "unack_count": {
                    "type": "integer"
                },
                "user_id": {
                    "type": "integer"
                },
                "user_key": {
                    "type": "string"
                }
            }
        },
        "handler.ListChannelMessages.response": {
            "type": "object",
            "properties": {
                "messages": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.MessageJSON"
                    }
                },
                "next_page_token": {
                    "type": "string"
                },
                "page_size": {
                    "type": "integer"
                }
            }
        },
        "handler.ListChannelSubscriptions.response": {
            "type": "object",
            "properties": {
                "subscriptions": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.SubscriptionJSON"
                    }
                }
            }
        },
        "handler.ListChannels.response": {
            "type": "object",
            "properties": {
                "channels": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.ChannelWithSubscriptionJSON"
                    }
                }
            }
        },
        "handler.ListClients.response": {
            "type": "object",
            "properties": {
                "clients": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.ClientJSON"
                    }
                }
            }
        },
        "handler.ListMessages.response": {
            "type": "object",
            "properties": {
                "messages": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.MessageJSON"
                    }
                },
                "next_page_token": {
                    "type": "string"
                },
                "page_size": {
                    "type": "integer"
                }
            }
        },
        "handler.ListUserKeys.response": {
            "type": "object",
            "properties": {
                "tokens": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.KeyTokenJSON"
                    }
                }
            }
        },
        "handler.ListUserSubscriptions.response": {
            "type": "object",
            "properties": {
                "subscriptions": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.SubscriptionJSON"
                    }
                }
            }
        },
        "handler.Register.response": {
            "type": "object",
            "properties": {
                "is_pro": {
                    "type": "boolean"
                },
                "message": {
                    "type": "string"
                },
                "quota": {
                    "type": "integer"
                },
                "quota_max": {
                    "type": "integer"
                },
                "success": {
                    "type": "boolean"
                },
                "user_id": {
                    "type": "integer"
                },
                "user_key": {
                    "type": "string"
                }
            }
        },
        "handler.Requery.response": {
            "type": "object",
            "properties": {
                "count": {
                    "type": "integer"
                },
                "data": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.CompatMessage"
                    }
                },
                "message": {
                    "type": "string"
                },
                "success": {
                    "type": "boolean"
                }
            }
        },
        "handler.SendMessage.combined": {
            "type": "object",
            "properties": {
                "channel": {
                    "type": "string",
                    "example": "test"
                },
                "content": {
                    "type": "string",
                    "example": "This is a message"
                },
                "key": {
                    "type": "string",
                    "example": "P3TNH8mvv14fm"
                },
                "msg_id": {
                    "type": "string",
                    "example": "db8b0e6a-a08c-4646"
                },
                "priority": {
                    "type": "integer",
                    "enum": [
                        0,
                        1,
                        2
                    ],
                    "example": 1
                },
                "sender_name": {
                    "type": "string",
                    "example": "example-server"
                },
                "timestamp": {
                    "type": "number",
                    "example": 1669824037
                },
                "title": {
                    "type": "string",
                    "example": "Hello World"
                },
                "user_id": {
                    "type": "string",
                    "example": "7725"
                }
            }
        },
        "handler.SendMessage.response": {
            "type": "object",
            "properties": {
                "errhighlight": {
                    "type": "integer"
                },
                "error": {
                    "$ref": "#/definitions/apierr.APIError"
                },
                "is_pro": {
                    "type": "boolean"
                },
                "message": {
                    "type": "string"
                },
                "messagecount": {
                    "type": "integer"
                },
                "quota": {
                    "type": "integer"
                },
                "quota_max": {
                    "type": "integer"
                },
                "scn_msg_id": {
                    "type": "string"
                },
                "success": {
                    "type": "boolean"
                },
                "suppress_send": {
                    "type": "boolean"
                }
            }
        },
        "handler.SendMessageCompat.response": {
            "type": "object",
            "properties": {
                "errhighlight": {
                    "type": "integer"
                },
                "error": {
                    "$ref": "#/definitions/apierr.APIError"
                },
                "is_pro": {
                    "type": "boolean"
                },
                "message": {
                    "type": "string"
                },
                "messagecount": {
                    "type": "integer"
                },
                "quota": {
                    "type": "integer"
                },
                "quota_max": {
                    "type": "integer"
                },
                "scn_msg_id": {
                    "type": "integer"
                },
                "success": {
                    "type": "boolean"
                },
                "suppress_send": {
                    "type": "boolean"
                }
            }
        },
        "handler.Sleep.response": {
            "type": "object",
            "properties": {
                "duration": {
                    "type": "number"
                },
                "end": {
                    "type": "string"
                },
                "start": {
                    "type": "string"
                }
            }
        },
        "handler.Update.response": {
            "type": "object",
            "properties": {
                "is_pro": {
                    "type": "integer"
                },
                "message": {
                    "type": "string"
                },
                "quota": {
                    "type": "integer"
                },
                "quota_max": {
                    "type": "integer"
                },
                "success": {
                    "type": "boolean"
                },
                "user_id": {
                    "type": "integer"
                },
                "user_key": {
                    "type": "string"
                }
            }
        },
        "handler.UpdateSubscription.body": {
            "type": "object",
            "properties": {
                "confirmed": {
                    "type": "boolean"
                }
            }
        },
        "handler.Upgrade.response": {
            "type": "object",
            "properties": {
                "is_pro": {
                    "type": "boolean"
                },
                "message": {
                    "type": "string"
                },
                "quota": {
                    "type": "integer"
                },
                "quota_max": {
                    "type": "integer"
                },
                "success": {
                    "type": "boolean"
                },
                "user_id": {
                    "type": "integer"
                }
            }
        },
        "handler.pingResponse": {
            "type": "object",
            "properties": {
                "info": {
                    "$ref": "#/definitions/handler.pingResponseInfo"
                },
                "message": {
                    "type": "string"
                }
            }
        },
        "handler.pingResponseInfo": {
            "type": "object",
            "properties": {
                "addr": {
                    "type": "string"
                },
                "headers": {
                    "type": "object",
                    "additionalProperties": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "method": {
                    "type": "string"
                },
                "request": {
                    "type": "string"
                },
                "uri": {
                    "type": "string"
                }
            }
        },
        "models.ChannelWithSubscriptionJSON": {
            "type": "object",
            "properties": {
                "channel_id": {
                    "type": "string"
                },
                "description_name": {
                    "type": "string"
                },
                "display_name": {
                    "type": "string"
                },
                "internal_name": {
                    "type": "string"
                },
                "messages_sent": {
                    "type": "integer"
                },
                "owner_user_id": {
                    "type": "string"
                },
                "subscribe_key": {
                    "description": "can be nil, depending on endpoint",
                    "type": "string"
                },
                "subscription": {
                    "$ref": "#/definitions/models.SubscriptionJSON"
                },
                "timestamp_created": {
                    "type": "string"
                },
                "timestamp_lastsent": {
                    "type": "string"
                }
            }
        },
        "models.ClientJSON": {
            "type": "object",
            "properties": {
                "agent_model": {
                    "type": "string"
                },
                "agent_version": {
                    "type": "string"
                },
                "client_id": {
                    "type": "string"
                },
                "fcm_token": {
                    "type": "string"
                },
                "timestamp_created": {
                    "type": "string"
                },
                "type": {
                    "$ref": "#/definitions/models.ClientType"
                },
                "user_id": {
                    "type": "string"
                }
            }
        },
        "models.ClientType": {
            "type": "string",
            "enum": [
                "ANDROID",
                "IOS"
            ],
            "x-enum-varnames": [
                "ClientTypeAndroid",
                "ClientTypeIOS"
            ]
        },
        "models.CompatMessage": {
            "type": "object",
            "properties": {
                "body": {
                    "type": "string"
                },
                "priority": {
                    "type": "integer"
                },
                "scn_msg_id": {
                    "type": "integer"
                },
                "timestamp": {
                    "type": "integer"
                },
                "title": {
                    "type": "string"
                },
                "trimmed": {
                    "type": "boolean"
                },
                "usr_msg_id": {
                    "type": "string"
                }
            }
        },
        "models.KeyTokenJSON": {
            "type": "object",
            "properties": {
                "all_channels": {
                    "type": "boolean"
                },
                "channels": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "keytoken_id": {
                    "type": "string"
                },
                "messages_sent": {
                    "type": "integer"
                },
                "name": {
                    "type": "string"
                },
                "owner_user_id": {
                    "type": "string"
                },
                "permissions": {
                    "type": "string"
                },
                "timestamp_created": {
                    "type": "string"
                },
                "timestamp_lastused": {
                    "type": "string"
                }
            }
        },
        "models.MessageJSON": {
            "type": "object",
            "properties": {
                "channel_id": {
                    "type": "string"
                },
                "channel_internal_name": {
                    "type": "string"
                },
                "content": {
                    "type": "string"
                },
                "message_id": {
                    "type": "string"
                },
                "owner_user_id": {
                    "type": "string"
                },
                "priority": {
                    "type": "integer"
                },
                "sender_ip": {
                    "type": "string"
                },
                "sender_name": {
                    "type": "string"
                },
                "sender_user_id": {
                    "type": "string"
                },
                "timestamp": {
                    "type": "string"
                },
                "title": {
                    "type": "string"
                },
                "trimmed": {
                    "type": "boolean"
                },
                "usr_message_id": {
                    "type": "string"
                }
            }
        },
        "models.SubscriptionJSON": {
            "type": "object",
            "properties": {
                "channel_id": {
                    "type": "string"
                },
                "channel_internal_name": {
                    "type": "string"
                },
                "channel_owner_user_id": {
                    "type": "string"
                },
                "confirmed": {
                    "type": "boolean"
                },
                "subscriber_user_id": {
                    "type": "string"
                },
                "subscription_id": {
                    "type": "string"
                },
                "timestamp_created": {
                    "type": "string"
                }
            }
        },
        "models.UserJSON": {
            "type": "object",
            "properties": {
                "default_channel": {
                    "type": "string"
                },
                "is_pro": {
                    "type": "boolean"
                },
                "messages_sent": {
                    "type": "integer"
                },
                "quota_max": {
                    "type": "integer"
                },
                "quota_remaining": {
                    "type": "integer"
                },
                "quota_used": {
                    "type": "integer"
                },
                "timestamp_created": {
                    "type": "string"
                },
                "timestamp_lastread": {
                    "type": "string"
                },
                "timestamp_lastsent": {
                    "type": "string"
                },
                "user_id": {
                    "type": "string"
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "models.UserJSONWithClientsAndKeys": {
            "type": "object",
            "properties": {
                "admin_key": {
                    "type": "string"
                },
                "clients": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.ClientJSON"
                    }
                },
                "default_channel": {
                    "type": "string"
                },
                "is_pro": {
                    "type": "boolean"
                },
                "messages_sent": {
                    "type": "integer"
                },
                "quota_max": {
                    "type": "integer"
                },
                "quota_remaining": {
                    "type": "integer"
                },
                "quota_used": {
                    "type": "integer"
                },
                "read_key": {
                    "type": "string"
                },
                "send_key": {
                    "type": "string"
                },
                "timestamp_created": {
                    "type": "string"
                },
                "timestamp_lastread": {
                    "type": "string"
                },
                "timestamp_lastsent": {
                    "type": "string"
                },
                "user_id": {
                    "type": "string"
                },
                "username": {
                    "type": "string"
                }
            }
        }
    },
    "tags": [
        {
            "name": "External"
        },
        {
            "name": "API-v1"
        },
        {
            "name": "API-v2"
        },
        {
            "name": "Common"
        }
    ]
}