basePath: / definitions: ginresp.apiError: properties: errhighlight: type: integer error: type: integer errorObj: type: string message: type: string success: type: boolean traceObj: type: string type: object ginresp.compatAPIError: properties: errid: type: integer message: type: string success: type: boolean type: object handler.Ack.response: properties: message: type: string new_ack: type: integer prev_ack: type: integer success: type: boolean type: object handler.AddClient.body: properties: agent_model: type: string agent_version: type: string client_type: type: string fcm_token: type: string required: - agent_model - agent_version - client_type - fcm_token type: object handler.CreateSubscription.body: properties: channel: type: string channelOwnerUserID: type: integer required: - channel - channelOwnerUserID type: object handler.CreateUser.body: properties: agent_model: type: string agent_version: type: string client_type: type: string fcm_token: type: string pro_token: type: string username: type: string required: - agent_model - agent_version - client_type - fcm_token type: object handler.DatabaseTest.response: properties: libVersion: type: string libVersionNumber: type: integer sourceID: type: string success: type: boolean type: object handler.Expand.response: properties: data: $ref: '#/definitions/models.CompatMessage' message: type: string success: type: boolean type: object handler.Health.response: properties: status: type: string type: object handler.Info.response: 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 type: object handler.ListChannelMessages.response: properties: messages: items: $ref: '#/definitions/models.MessageJSON' type: array next_page_token: type: string page_size: type: integer type: object handler.ListChannelSubscriptions.response: properties: subscriptions: items: $ref: '#/definitions/models.SubscriptionJSON' type: array type: object handler.ListChannels.response: properties: channels: items: $ref: '#/definitions/models.ChannelJSON' type: array type: object handler.ListClients.response: properties: clients: items: $ref: '#/definitions/models.ClientJSON' type: array type: object handler.ListMessages.response: properties: messages: items: $ref: '#/definitions/models.MessageJSON' type: array next_page_token: type: string page_size: type: integer type: object handler.ListUserSubscriptions.response: properties: subscriptions: items: $ref: '#/definitions/models.SubscriptionJSON' type: array type: object handler.Register.response: 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 type: object handler.Requery.response: properties: count: type: integer data: items: $ref: '#/definitions/models.CompatMessage' type: array message: type: string success: type: boolean type: object handler.SendMessage.body: properties: chanKey: type: string channel: type: string content: type: string msg_id: type: string priority: type: integer timestamp: type: number title: type: string user_id: type: integer user_key: type: string type: object handler.Update.response: 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 type: object handler.UpdateUser.body: properties: pro_token: type: string username: type: string type: object handler.Upgrade.response: properties: is_pro: type: boolean message: type: string quota: type: integer quota_max: type: integer success: type: boolean user_id: type: integer type: object handler.pingResponse: properties: info: $ref: '#/definitions/handler.pingResponseInfo' message: type: string type: object handler.pingResponseInfo: properties: addr: type: string headers: additionalProperties: items: type: string type: array type: object method: type: string request: type: string uri: type: string type: object handler.sendMessageInternal.response: properties: errhighlight: type: integer error: type: integer 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 type: object models.ChannelJSON: properties: channel_id: type: integer messages_sent: type: integer name: type: string owner_user_id: type: integer send_key: type: string subscribe_key: type: string timestamp_created: type: string timestamp_last_sent: type: string type: object models.ClientJSON: properties: agent_model: type: string agent_version: type: string client_id: type: integer fcm_token: type: string timestamp_created: type: string type: type: string user_id: type: integer type: object models.CompatMessage: 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 type: object models.MessageJSON: properties: body: type: string channel_id: type: integer channel_name: type: string owner_user_id: type: integer priority: type: integer scn_message_id: type: integer sender_user_id: type: integer timestamp: type: string title: type: string trimmed: type: boolean usr_message_id: type: string type: object models.SubscriptionJSON: properties: channel_id: type: integer channel_name: type: string channel_owner_user_id: type: integer confirmed: type: boolean subscriber_user_id: type: integer subscription_id: type: integer timestamp_created: type: string type: object models.UserJSON: properties: admin_key: type: string is_pro: type: boolean messages_sent: type: integer quota_used: type: integer quota_used_day: type: string read_key: type: string send_key: type: string timestamp_created: type: string timestamp_last_read: type: string timestamp_last_sent: type: string user_id: type: integer username: type: string type: object host: scn.blackforestbytes.com info: contact: {} description: API for SCN title: SimpleCloudNotifier API version: "2.0" paths: /: post: description: All parameter can be set via query-parameter or the json body. Only UserID, UserKey and Title are required parameters: - in: query name: chanKey type: string - in: query name: channel type: string - in: query name: content type: string - in: query name: priority type: integer - in: query name: sendTimestamp type: number - in: query name: title type: string - in: query name: userID type: integer - in: query name: userKey type: string - in: query name: userMessageID type: string - description: ' ' in: body name: post_body schema: $ref: '#/definitions/handler.SendMessage.body' responses: "200": description: OK schema: $ref: '#/definitions/handler.sendMessageInternal.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' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Send a new message /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 Simply 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 If there are no more entries the token "@end" will be returned By default we return long messages with a trimmed body, if trimmed=false is supplied we return full messages (this reduces the max page_size) operationId: api-messages-list parameters: - in: query name: filter type: string - in: query name: nextPageToken type: string - in: query name: pageSize type: integer - in: query name: trimmed type: boolean responses: "200": description: OK schema: $ref: '#/definitions/handler.ListMessages.response' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: List all (subscribed) messages /api-v2/messages/{mid}: patch: description: The user must own the message and request the resource with the ADMIN Key operationId: api-messages-delete parameters: - description: SCNMessageID in: path name: mid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/models.MessageJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Delete a single message /api-v2/users/: post: operationId: api-user-create parameters: - description: ' ' in: body name: post_body schema: $ref: '#/definitions/handler.CreateUser.body' responses: "200": description: OK schema: $ref: '#/definitions/models.UserJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Create a new user /api-v2/users/{uid}: get: operationId: api-user-get parameters: - description: UserID in: path name: uid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/models.UserJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Get a user patch: description: The body-values are optional, only send the ones you want to update operationId: api-user-update parameters: - description: ' ' in: body name: post_body schema: $ref: '#/definitions/handler.UpdateUser.body' responses: "200": description: OK schema: $ref: '#/definitions/models.UserJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: (Partially) update a user /api-v2/users/{uid}/channels: get: operationId: api-channels-list parameters: - description: UserID in: path name: uid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/handler.ListChannels.response' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: List all channels of a user /api-v2/users/{uid}/channels/{cid}: get: operationId: api-channels-get parameters: - description: UserID in: path name: uid required: true type: integer - description: ChannelID in: path name: cid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/models.ChannelJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: List all channels of a user /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 Simply 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 If there are no more entries the token "@end" will be returned By default we return long messages with a trimmed body, if trimmed=false is supplied we return full messages (this reduces the max page_size) operationId: api-channel-messages parameters: - in: query name: filter type: string - in: query name: nextPageToken type: string - in: query name: pageSize type: integer - in: query name: trimmed type: boolean responses: "200": description: OK schema: $ref: '#/definitions/handler.ListChannelMessages.response' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: List messages of a channel /api-v2/users/{uid}/channels/{cid}/subscriptions: get: operationId: api-chan-subscriptions-list parameters: - description: UserID in: path name: uid required: true type: integer - description: ChannelID in: path name: cid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/handler.ListChannelSubscriptions.response' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: List all subscriptions of a channel /api-v2/users/{uid}/clients: get: operationId: api-clients-list parameters: - description: UserID in: path name: uid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/handler.ListClients.response' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: List all clients post: operationId: api-clients-delete parameters: - description: UserID in: path name: uid required: true type: integer - description: ClientID in: path name: cid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/models.ClientJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Delete a client /api-v2/users/{uid}/clients/{cid}: get: operationId: api-clients-get parameters: - description: UserID in: path name: uid required: true type: integer - description: ClientID in: path name: cid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/models.ClientJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Get a single clients /api-v2/users/{uid}/subscriptions: get: operationId: api-user-subscriptions-list parameters: - description: UserID in: path name: uid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/handler.ListUserSubscriptions.response' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: List all channels of a user post: operationId: api-subscriptions-create parameters: - description: UserID in: path name: uid required: true type: integer - in: query name: chanSubscribeKey type: string - description: ' ' in: body name: post_data schema: $ref: '#/definitions/handler.CreateSubscription.body' responses: "200": description: OK schema: $ref: '#/definitions/models.SubscriptionJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Creare/Request a subscription /api-v2/users/{uid}/subscriptions/{sid}: delete: operationId: api-subscriptions-delete parameters: - description: UserID in: path name: uid required: true type: integer - description: SubscriptionID in: path name: sid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/models.SubscriptionJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Cancel (delete) subscription get: operationId: api-subscriptions-get parameters: - description: UserID in: path name: uid required: true type: integer - description: SubscriptionID in: path name: sid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/models.SubscriptionJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Get a single subscription patch: operationId: api-subscriptions-update parameters: - description: UserID in: path name: uid required: true type: integer - description: SubscriptionID in: path name: sid required: true type: integer responses: "200": description: OK schema: $ref: '#/definitions/models.SubscriptionJSON' "400": description: Bad Request schema: $ref: '#/definitions/ginresp.apiError' "401": description: Unauthorized schema: $ref: '#/definitions/ginresp.apiError' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Update a subscription (e.g. confirm) /api/ack.php: get: deprecated: true operationId: compat-ack parameters: - description: the user_id in: query name: user_id required: true type: string - description: the user_key in: query name: user_key required: true type: string - description: the message id in: query name: scn_msg_id required: true type: string - description: the user_id in: formData name: user_id required: true type: string - description: the user_key in: formData name: user_key required: true type: string - description: the message id in: formData name: scn_msg_id required: true type: string responses: "200": description: OK schema: $ref: '#/definitions/ginresp.compatAPIError' summary: Acknowledge that a message was received /api/expand.php: get: deprecated: true operationId: compat-expand parameters: - description: The user_id in: query name: user_id required: true type: string - description: The user_key in: query name: user_key required: true type: string - description: The message-id in: query name: scn_msg_id required: true type: string - description: The user_id in: formData name: user_id required: true type: string - description: The user_key in: formData name: user_key required: true type: string - description: The message-id in: formData name: scn_msg_id required: true type: string responses: "200": description: OK schema: $ref: '#/definitions/ginresp.compatAPIError' summary: Get a whole (potentially truncated) message /api/info.php: get: deprecated: true operationId: compat-info parameters: - description: the user_id in: query name: user_id required: true type: string - description: the user_key in: query name: user_key required: true type: string - description: the user_id in: formData name: user_id required: true type: string - description: the user_key in: formData name: user_key required: true type: string responses: "200": description: OK schema: $ref: '#/definitions/ginresp.compatAPIError' summary: Get information about the current user /api/register.php: get: deprecated: true operationId: compat-register parameters: - description: the (android) fcm token in: query name: fcm_token required: true type: string - description: if the user is a paid account enum: - "true" - "false" in: query name: pro required: true type: string - description: the (android) IAP token in: query name: pro_token required: true type: string - description: the (android) fcm token in: formData name: fcm_token required: true type: string - description: if the user is a paid account enum: - "true" - "false" in: formData name: pro required: true type: string - description: the (android) IAP token in: formData name: pro_token required: true type: string responses: "200": description: OK schema: $ref: '#/definitions/ginresp.compatAPIError' summary: Register a new account /api/requery.php: get: deprecated: true operationId: compat-requery parameters: - description: the user_id in: query name: user_id required: true type: string - description: the user_key in: query name: user_key required: true type: string - description: the user_id in: formData name: user_id required: true type: string - description: the user_key in: formData name: user_key required: true type: string responses: "200": description: OK schema: $ref: '#/definitions/ginresp.compatAPIError' summary: Return all not-acknowledged messages /api/update.php: get: deprecated: true operationId: compat-update parameters: - description: the user_id in: query name: user_id required: true type: string - description: the user_key in: query name: user_key required: true type: string - description: the (android) fcm token in: query name: fcm_token required: true type: string - description: the user_id in: formData name: user_id required: true type: string - description: the user_key in: formData name: user_key required: true type: string - description: the (android) fcm token in: formData name: fcm_token required: true type: string responses: "200": description: OK schema: $ref: '#/definitions/ginresp.compatAPIError' summary: Set the fcm-token (android) /api/upgrade.php: get: deprecated: true operationId: compat-upgrade parameters: - description: the user_id in: query name: user_id required: true type: string - description: the user_key in: query name: user_key required: true type: string - description: if the user is a paid account enum: - "true" - "false" in: query name: pro required: true type: string - description: the (android) IAP token in: query name: pro_token required: true type: string - description: the user_id in: formData name: user_id required: true type: string - description: the user_key in: formData name: user_key required: true type: string - description: if the user is a paid account enum: - "true" - "false" in: formData name: pro required: true type: string - description: the (android) IAP token in: formData name: pro_token required: true type: string responses: "200": description: OK schema: $ref: '#/definitions/ginresp.compatAPIError' summary: Upgrade a free account to a paid account /db-test: get: responses: "200": description: OK schema: $ref: '#/definitions/handler.DatabaseTest.response' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' /health: get: responses: "200": description: OK schema: $ref: '#/definitions/handler.Health.response' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' /ping: delete: responses: "200": description: OK schema: $ref: '#/definitions/handler.pingResponse' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' get: responses: "200": description: OK schema: $ref: '#/definitions/handler.pingResponse' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' patch: responses: "200": description: OK schema: $ref: '#/definitions/handler.pingResponse' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' post: responses: "200": description: OK schema: $ref: '#/definitions/handler.pingResponse' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' put: responses: "200": description: OK schema: $ref: '#/definitions/handler.pingResponse' "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 parameters: - in: query name: chanKey type: string - in: query name: channel type: string - in: query name: content type: string - in: query name: priority type: integer - in: query name: sendTimestamp type: number - in: query name: title type: string - in: query name: userID type: integer - in: query name: userKey type: string - in: query name: userMessageID type: string - description: ' ' in: body name: post_body schema: $ref: '#/definitions/handler.SendMessage.body' responses: "200": description: OK schema: $ref: '#/definitions/handler.sendMessageInternal.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' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Send a new message /send.php: post: deprecated: true description: All parameter can be set via query-parameter or form-data body. Only UserID, UserKey and Title are required parameters: - in: query name: content type: string - in: query name: priority type: integer - in: query name: sendTimestamp type: number - in: query name: title type: string - in: query name: userID type: integer - in: query name: userKey type: string - in: query name: userMessageID type: string - in: formData name: content type: string - in: formData name: priority type: integer - in: formData name: sendTimestamp type: number - in: formData name: title type: string - in: formData name: userID type: integer - in: formData name: userKey type: string - in: formData name: userMessageID type: string responses: "200": description: OK schema: $ref: '#/definitions/handler.sendMessageInternal.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' "404": description: Not Found schema: $ref: '#/definitions/ginresp.apiError' "500": description: Internal Server Error schema: $ref: '#/definitions/ginresp.apiError' summary: Send a new message (compatibility) swagger: "2.0"