{ "schemes": [ "http", "https" ], "swagger": "2.0", "info": { "description": "A chaotic, self-hosted Discord-like platform API", "title": "Dumpster API", "contact": {}, "version": "1.0" }, "host": "localhost:8080", "basePath": "/api/v1", "paths": { "/auth/login/password": { "post": { "description": "Authenticate with email and password", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Login with email and password", "parameters": [ { "description": "Login credentials", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/auth.loginRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/auth/logout": { "post": { "description": "End the current session", "tags": [ "auth" ], "summary": "Logout", "responses": { "204": { "description": "No Content" } } } }, "/auth/me": { "get": { "security": [ { "SessionAuth": [] } ], "description": "Get the authenticated user's profile", "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Get current user profile", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/auth.UserProfile" } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "patch": { "security": [ { "SessionAuth": [] } ], "description": "Update the authenticated user's profile", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Update current user profile", "parameters": [ { "description": "Profile update data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/auth.updateProfileRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/auth.UserProfile" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/auth/register": { "post": { "description": "Create a new user account", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "auth" ], "summary": "Register a new user", "parameters": [ { "description": "Registration data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/auth.registerRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "409": { "description": "Conflict", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/auth/webauthn/login/begin": { "post": { "description": "Start passkey authentication", "produces": [ "application/json" ], "tags": [ "webauthn" ], "summary": "Begin passkey login", "responses": { "200": { "description": "WebAuthn login options", "schema": { "type": "object" } }, "500": { "description": "Internal Server Error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/auth/webauthn/login/finish": { "post": { "description": "Complete passkey authentication", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "webauthn" ], "summary": "Finish passkey login", "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/auth/webauthn/register/begin": { "post": { "security": [ { "SessionAuth": [] } ], "description": "Start passkey registration for an authenticated user", "produces": [ "application/json" ], "tags": [ "webauthn" ], "summary": "Begin passkey registration", "responses": { "200": { "description": "WebAuthn registration options", "schema": { "type": "object" } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "500": { "description": "Internal Server Error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/auth/webauthn/register/finish": { "post": { "security": [ { "SessionAuth": [] } ], "description": "Complete passkey registration", "produces": [ "application/json" ], "tags": [ "webauthn" ], "summary": "Finish passkey registration", "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "500": { "description": "Internal Server Error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/bots": { "get": { "security": [ { "SessionAuth": [] } ], "description": "List all bots owned by the current user", "produces": [ "application/json" ], "tags": [ "bots" ], "summary": "List bots", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/bot.botResponse" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "post": { "security": [ { "SessionAuth": [] } ], "description": "Create a new bot", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "bots" ], "summary": "Create a bot", "parameters": [ { "description": "Bot data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/bot.createBotRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/bot.botWithToken" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/bots/servers/{serverID}/commands": { "get": { "description": "List all slash commands registered in a server (public)", "produces": [ "application/json" ], "tags": [ "bot commands" ], "summary": "List server commands", "parameters": [ { "type": "string", "description": "Server ID", "name": "serverID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/bot.slashCommandResponse" } } }, "500": { "description": "Internal Server Error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/bots/{botID}": { "get": { "security": [ { "SessionAuth": [] } ], "description": "Get a bot by ID (owner only)", "produces": [ "application/json" ], "tags": [ "bots" ], "summary": "Get a bot", "parameters": [ { "type": "string", "description": "Bot ID", "name": "botID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/bot.botResponse" } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "delete": { "security": [ { "SessionAuth": [] } ], "description": "Delete a bot (owner only)", "tags": [ "bots" ], "summary": "Delete a bot", "parameters": [ { "type": "string", "description": "Bot ID", "name": "botID", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "patch": { "security": [ { "SessionAuth": [] } ], "description": "Update a bot's name, description, or avatar (owner only)", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "bots" ], "summary": "Update a bot", "parameters": [ { "type": "string", "description": "Bot ID", "name": "botID", "in": "path", "required": true }, { "description": "Bot update data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/bot.updateBotRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/bot.botResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/bots/{botID}/commands": { "get": { "security": [ { "SessionAuth": [] } ], "description": "List all slash commands for a bot", "produces": [ "application/json" ], "tags": [ "bot commands" ], "summary": "List bot commands", "parameters": [ { "type": "string", "description": "Bot ID", "name": "botID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/bot.slashCommandResponse" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "post": { "security": [ { "SessionAuth": [] } ], "description": "Create a new slash command for a bot", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "bot commands" ], "summary": "Create a slash command", "parameters": [ { "type": "string", "description": "Bot ID", "name": "botID", "in": "path", "required": true }, { "description": "Command data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/bot.createCommandRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/bot.slashCommandResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "409": { "description": "Conflict", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/bots/{botID}/commands/{cmdID}": { "delete": { "security": [ { "SessionAuth": [] } ], "description": "Delete a slash command", "tags": [ "bot commands" ], "summary": "Delete a slash command", "parameters": [ { "type": "string", "description": "Bot ID", "name": "botID", "in": "path", "required": true }, { "type": "string", "description": "Command ID", "name": "cmdID", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/bots/{botID}/regenerate-token": { "post": { "security": [ { "SessionAuth": [] } ], "description": "Regenerate a bot's API token (owner only)", "produces": [ "application/json" ], "tags": [ "bots" ], "summary": "Regenerate bot token", "parameters": [ { "type": "string", "description": "Bot ID", "name": "botID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/bot.botWithToken" } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/bots/{botID}/servers": { "post": { "security": [ { "SessionAuth": [] } ], "description": "Add a bot to a server", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "bots" ], "summary": "Add bot to server", "parameters": [ { "type": "string", "description": "Bot ID", "name": "botID", "in": "path", "required": true }, { "description": "Server data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/bot.addToServerRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/bots/{botID}/servers/{serverID}": { "delete": { "security": [ { "SessionAuth": [] } ], "description": "Remove a bot from a server", "tags": [ "bots" ], "summary": "Remove bot from server", "parameters": [ { "type": "string", "description": "Bot ID", "name": "botID", "in": "path", "required": true }, { "type": "string", "description": "Server ID", "name": "serverID", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/channels/{channelID}/messages": { "get": { "security": [ { "SessionAuth": [] } ], "description": "List messages in a channel with pagination", "produces": [ "application/json" ], "tags": [ "messages" ], "summary": "List messages", "parameters": [ { "type": "string", "description": "Channel ID", "name": "channelID", "in": "path", "required": true }, { "type": "integer", "description": "Max messages to return (1-100, default 50)", "name": "limit", "in": "query" }, { "type": "string", "description": "Message ID to fetch messages before", "name": "before", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/message.messageResponse" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "post": { "security": [ { "SessionAuth": [] } ], "description": "Send a message to a channel", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "messages" ], "summary": "Create a message", "parameters": [ { "type": "string", "description": "Channel ID", "name": "channelID", "in": "path", "required": true }, { "description": "Message data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/message.createMessageRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/message.messageResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/channels/{channelID}/messages/{messageID}": { "delete": { "security": [ { "SessionAuth": [] } ], "description": "Delete a message (author only)", "tags": [ "messages" ], "summary": "Delete a message", "parameters": [ { "type": "string", "description": "Channel ID", "name": "channelID", "in": "path", "required": true }, { "type": "string", "description": "Message ID", "name": "messageID", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "patch": { "security": [ { "SessionAuth": [] } ], "description": "Edit a message (author only)", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "messages" ], "summary": "Update a message", "parameters": [ { "type": "string", "description": "Channel ID", "name": "channelID", "in": "path", "required": true }, { "type": "string", "description": "Message ID", "name": "messageID", "in": "path", "required": true }, { "description": "Message update data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/message.updateMessageRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/message.messageResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/channels/{channelID}/webhooks": { "get": { "security": [ { "SessionAuth": [] } ], "description": "List webhooks for a channel", "produces": [ "application/json" ], "tags": [ "webhooks" ], "summary": "List webhooks", "parameters": [ { "type": "string", "description": "Channel ID", "name": "channelID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/webhook.webhookResponse" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "post": { "security": [ { "SessionAuth": [] } ], "description": "Create a new webhook for a channel", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "webhooks" ], "summary": "Create a webhook", "parameters": [ { "type": "string", "description": "Channel ID", "name": "channelID", "in": "path", "required": true }, { "description": "Webhook data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/webhook.createWebhookRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/webhook.webhookWithToken" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/invites/{code}": { "get": { "description": "Get information about an invite by code", "produces": [ "application/json" ], "tags": [ "invites" ], "summary": "Get invite info", "parameters": [ { "type": "string", "description": "Invite code", "name": "code", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/invite.inviteResponse" } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/invites/{code}/join": { "post": { "security": [ { "SessionAuth": [] } ], "description": "Join a server using an invite code", "produces": [ "application/json" ], "tags": [ "invites" ], "summary": "Join server via invite", "parameters": [ { "type": "string", "description": "Invite code", "name": "code", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "409": { "description": "Conflict", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/messages/{messageID}/reactions": { "get": { "security": [ { "SessionAuth": [] } ], "description": "List reactions on a message grouped by emoji", "produces": [ "application/json" ], "tags": [ "reactions" ], "summary": "List reactions", "parameters": [ { "type": "string", "description": "Message ID", "name": "messageID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/reaction.emojiGroup" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "post": { "security": [ { "SessionAuth": [] } ], "description": "Add a reaction to a message", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "reactions" ], "summary": "Add a reaction", "parameters": [ { "type": "string", "description": "Message ID", "name": "messageID", "in": "path", "required": true }, { "description": "Reaction data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/reaction.addReactionRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/reaction.reactionResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/messages/{messageID}/reactions/{emoji}": { "delete": { "security": [ { "SessionAuth": [] } ], "description": "Remove a reaction from a message", "tags": [ "reactions" ], "summary": "Remove a reaction", "parameters": [ { "type": "string", "description": "Message ID", "name": "messageID", "in": "path", "required": true }, { "type": "string", "description": "Emoji to remove", "name": "emoji", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/push/subscribe": { "post": { "security": [ { "SessionAuth": [] } ], "description": "Subscribe to push notifications", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "push" ], "summary": "Subscribe to push notifications", "parameters": [ { "description": "Push subscription with endpoint, p256dh, and auth", "name": "body", "in": "body", "required": true, "schema": { "type": "object" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/push/unsubscribe": { "post": { "security": [ { "SessionAuth": [] } ], "description": "Unsubscribe from push notifications", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "push" ], "summary": "Unsubscribe from push notifications", "parameters": [ { "description": "Endpoint to unsubscribe", "name": "body", "in": "body", "required": true, "schema": { "type": "object" } } ], "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/push/vapid-public-key": { "get": { "description": "Get the VAPID public key for push notification subscriptions", "produces": [ "application/json" ], "tags": [ "push" ], "summary": "Get VAPID public key", "responses": { "200": { "description": "OK", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/servers": { "get": { "security": [ { "SessionAuth": [] } ], "description": "List all servers the current user is a member of", "produces": [ "application/json" ], "tags": [ "servers" ], "summary": "List servers", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/server.serverResponse" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "post": { "security": [ { "SessionAuth": [] } ], "description": "Create a new server", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "servers" ], "summary": "Create a server", "parameters": [ { "description": "Server data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/server.createServerRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/server.serverResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/servers/{serverID}": { "get": { "security": [ { "SessionAuth": [] } ], "description": "Get a server by ID", "produces": [ "application/json" ], "tags": [ "servers" ], "summary": "Get a server", "parameters": [ { "type": "string", "description": "Server ID", "name": "serverID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/server.serverResponse" } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "delete": { "security": [ { "SessionAuth": [] } ], "description": "Delete a server (owner only)", "tags": [ "servers" ], "summary": "Delete a server", "parameters": [ { "type": "string", "description": "Server ID", "name": "serverID", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "patch": { "security": [ { "SessionAuth": [] } ], "description": "Update a server's name or icon (owner only)", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "servers" ], "summary": "Update a server", "parameters": [ { "type": "string", "description": "Server ID", "name": "serverID", "in": "path", "required": true }, { "description": "Server update data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/server.updateServerRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/server.serverResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/servers/{serverID}/channels": { "get": { "security": [ { "SessionAuth": [] } ], "description": "List channels in a server", "produces": [ "application/json" ], "tags": [ "channels" ], "summary": "List channels", "parameters": [ { "type": "string", "description": "Server ID", "name": "server_id", "in": "query", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/channel.channelResponse" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "post": { "security": [ { "SessionAuth": [] } ], "description": "Create a new channel in a server", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "channels" ], "summary": "Create a channel", "parameters": [ { "description": "Channel data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/channel.createChannelRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/channel.channelResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/servers/{serverID}/channels/{channelID}": { "get": { "security": [ { "SessionAuth": [] } ], "description": "Get a channel by ID", "produces": [ "application/json" ], "tags": [ "channels" ], "summary": "Get a channel", "parameters": [ { "type": "string", "description": "Channel ID", "name": "channelID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/channel.channelResponse" } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "delete": { "security": [ { "SessionAuth": [] } ], "description": "Delete a channel (server owner only)", "tags": [ "channels" ], "summary": "Delete a channel", "parameters": [ { "type": "string", "description": "Channel ID", "name": "channelID", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } }, "patch": { "security": [ { "SessionAuth": [] } ], "description": "Update a channel's properties", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "channels" ], "summary": "Update a channel", "parameters": [ { "type": "string", "description": "Channel ID", "name": "channelID", "in": "path", "required": true }, { "description": "Channel update data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/channel.updateChannelRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/channel.channelResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/servers/{serverID}/invites": { "post": { "security": [ { "SessionAuth": [] } ], "description": "Create an invite code for a server", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "invites" ], "summary": "Create an invite", "parameters": [ { "type": "string", "description": "Server ID", "name": "serverID", "in": "path", "required": true }, { "description": "Invite options", "name": "body", "in": "body", "schema": { "$ref": "#/definitions/invite.createInviteRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "$ref": "#/definitions/invite.inviteResponse" } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/voice/rooms/{roomID}/participants": { "get": { "description": "Get participants in a voice room", "produces": [ "application/json" ], "tags": [ "voice" ], "summary": "Get voice room participants", "parameters": [ { "type": "string", "description": "Room ID", "name": "roomID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "type": "object" } } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "500": { "description": "Internal Server Error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/voice/token": { "post": { "security": [ { "SessionAuth": [] } ], "description": "Get a LiveKit access token for a voice room", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "voice" ], "summary": "Get voice token", "parameters": [ { "description": "Room data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/voice.tokenRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/voice.tokenResponse" } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/webhooks/{webhookID}": { "delete": { "security": [ { "SessionAuth": [] } ], "description": "Delete a webhook", "tags": [ "webhooks" ], "summary": "Delete a webhook", "parameters": [ { "type": "string", "description": "Webhook ID", "name": "webhookID", "in": "path", "required": true } ], "responses": { "204": { "description": "No Content" }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "403": { "description": "Forbidden", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/webhooks/{webhookID}/{token}": { "post": { "description": "Execute a webhook to send a message (no auth required)", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "webhooks" ], "summary": "Execute a webhook", "parameters": [ { "type": "string", "description": "Webhook ID", "name": "webhookID", "in": "path", "required": true }, { "type": "string", "description": "Webhook token", "name": "token", "in": "path", "required": true }, { "description": "Message data", "name": "body", "in": "body", "required": true, "schema": { "$ref": "#/definitions/webhook.executeWebhookRequest" } } ], "responses": { "201": { "description": "Created", "schema": { "type": "object", "additionalProperties": true } }, "400": { "description": "Bad Request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "401": { "description": "Unauthorized", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Not Found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } } }, "definitions": { "auth.UserProfile": { "type": "object", "properties": { "accent_color": { "type": "string" }, "avatar": { "type": "string" }, "bio": { "type": "string" }, "created_at": { "type": "string" }, "display_name": { "type": "string" }, "email": { "type": "string" }, "id": { "type": "string" }, "status": { "type": "string" }, "status_text": { "type": "string" }, "username": { "type": "string" } } }, "auth.loginRequest": { "type": "object", "properties": { "email": { "type": "string" }, "password": { "type": "string" } } }, "auth.registerRequest": { "type": "object", "properties": { "display_name": { "type": "string" }, "email": { "type": "string" }, "password": { "type": "string" }, "username": { "type": "string" } } }, "auth.updateProfileRequest": { "type": "object", "properties": { "accent_color": { "type": "string" }, "bio": { "type": "string" }, "display_name": { "type": "string" }, "status_text": { "type": "string" } } }, "bot.addToServerRequest": { "type": "object", "properties": { "server_id": { "type": "string" } } }, "bot.botResponse": { "type": "object", "properties": { "avatar": { "type": "string" }, "created_at": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "owner_id": { "type": "string" } } }, "bot.botWithToken": { "type": "object", "properties": { "avatar": { "type": "string" }, "created_at": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "owner_id": { "type": "string" }, "token": { "type": "string" } } }, "bot.createBotRequest": { "type": "object", "properties": { "description": { "type": "string" }, "name": { "type": "string" } } }, "bot.createCommandRequest": { "type": "object", "properties": { "description": { "type": "string" }, "name": { "type": "string" }, "options": {}, "server_id": { "type": "string" } } }, "bot.slashCommandResponse": { "type": "object", "properties": { "bot_id": { "type": "string" }, "created_at": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "options": {}, "server_id": { "type": "string" } } }, "bot.updateBotRequest": { "type": "object", "properties": { "avatar": { "type": "string" }, "description": { "type": "string" }, "name": { "type": "string" } } }, "channel.channelResponse": { "type": "object", "properties": { "category": { "type": "string" }, "created_at": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "position": { "type": "integer" }, "server_id": { "type": "string" }, "type": { "type": "string" } } }, "channel.createChannelRequest": { "type": "object", "properties": { "category": { "type": "string" }, "name": { "type": "string" }, "position": { "type": "integer" }, "server_id": { "type": "string" }, "type": { "type": "string" } } }, "channel.updateChannelRequest": { "type": "object", "properties": { "category": { "type": "string" }, "name": { "type": "string" }, "position": { "type": "integer" }, "type": { "type": "string" } } }, "invite.createInviteRequest": { "type": "object", "properties": { "expires_hours": { "type": "integer" }, "max_uses": { "type": "integer" } } }, "invite.inviteResponse": { "type": "object", "properties": { "code": { "type": "string" }, "created_at": { "type": "string" }, "creator_id": { "type": "string" }, "expires_at": { "type": "string" }, "id": { "type": "string" }, "max_uses": { "type": "integer" }, "server_id": { "type": "string" }, "server_name": { "type": "string" }, "use_count": { "type": "integer" } } }, "message.createMessageRequest": { "type": "object", "properties": { "content": { "type": "string" }, "reply_to": { "type": "string" } } }, "message.messageResponse": { "type": "object", "properties": { "author_display_name": { "type": "string" }, "author_id": { "type": "string" }, "author_username": { "type": "string" }, "channel_id": { "type": "string" }, "content": { "type": "string" }, "created_at": { "type": "string" }, "edited_at": { "type": "string" }, "id": { "type": "string" } } }, "message.updateMessageRequest": { "type": "object", "properties": { "content": { "type": "string" } } }, "reaction.addReactionRequest": { "type": "object", "properties": { "emoji": { "type": "string" } } }, "reaction.emojiGroup": { "type": "object", "properties": { "count": { "type": "integer" }, "details": { "type": "array", "items": { "$ref": "#/definitions/reaction.reactionResponse" } }, "emoji": { "type": "string" }, "users": { "type": "array", "items": { "type": "string" } } } }, "reaction.reactionResponse": { "type": "object", "properties": { "created_at": { "type": "string" }, "emoji": { "type": "string" }, "id": { "type": "string" }, "message_id": { "type": "string" }, "user_id": { "type": "string" } } }, "server.createServerRequest": { "type": "object", "properties": { "icon": { "type": "string" }, "name": { "type": "string" } } }, "server.serverResponse": { "type": "object", "properties": { "icon": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "owner_id": { "type": "string" } } }, "server.updateServerRequest": { "type": "object", "properties": { "icon": { "type": "string" }, "name": { "type": "string" } } }, "voice.tokenRequest": { "type": "object", "properties": { "room_name": { "type": "string" } } }, "voice.tokenResponse": { "type": "object", "properties": { "livekit_url": { "type": "string" }, "token": { "type": "string" } } }, "webhook.createWebhookRequest": { "type": "object", "properties": { "avatar": { "type": "string" }, "name": { "type": "string" } } }, "webhook.executeWebhookRequest": { "type": "object", "properties": { "avatar": { "type": "string" }, "content": { "type": "string" }, "username": { "type": "string" } } }, "webhook.webhookResponse": { "type": "object", "properties": { "avatar": { "type": "string" }, "channel_id": { "type": "string" }, "created_at": { "type": "string" }, "created_by": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" } } }, "webhook.webhookWithToken": { "type": "object", "properties": { "avatar": { "type": "string" }, "channel_id": { "type": "string" }, "created_at": { "type": "string" }, "created_by": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "token": { "type": "string" } } } }, "securityDefinitions": { "SessionAuth": { "type": "apiKey", "name": "dumpster_session", "in": "cookie" } } }