{ "openapi": "3.1.0", "info": { "title": "OVE Donations API", "version": "1.0.0", "description": "OVE donation pages, Messenger login, Crypto Gateway payments and OBS alerts." }, "servers": [ { "url": "https://do.ove.rs" } ], "paths": { "/health": { "get": { "tags": [ "Сервис" ], "summary": "Состояние Gateway", "description": "Состояние Gateway. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "get_health", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } } } }, "/api/assets": { "get": { "tags": [ "Сервис" ], "summary": "Активы для донатов", "description": "Активы для донатов. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "get_api_assets", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } } } }, "/api/auth/start": { "post": { "tags": [ "Авторизация" ], "summary": "Вход стримера через Messenger", "description": "Вход стримера через Messenger. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "post_api_auth_start", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" }, "example": { "email": "streamer@example.com" } } } } } }, "/api/auth/poll/{flow}": { "get": { "tags": [ "Авторизация" ], "summary": "Статус входа стримера", "description": "Статус входа стримера. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "get_api_auth_poll_flow", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "parameters": [ { "name": "flow", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/logout": { "post": { "tags": [ "Авторизация" ], "summary": "Выход из Donation Service", "description": "Выход из Donation Service. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "post_api_logout", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ] } }, "/api/me": { "get": { "tags": [ "Стример" ], "summary": "Панель стримера", "description": "Панель стримера. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "get_api_me", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ] } }, "/api/profile": { "patch": { "tags": [ "Стример" ], "summary": "Настройки страницы и OBS", "description": "Настройки страницы и OBS. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "patch_api_profile", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" }, "example": { "display_name": "My channel", "slug": "my-channel", "accent_color": "#b9f541", "duration_seconds": 8, "show_donor_name": true, "show_message": true } } } } } }, "/api/sound": { "put": { "tags": [ "OBS" ], "summary": "Загрузка звука", "description": "Загрузка звука. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "put_api_sound", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ] }, "delete": { "tags": [ "OBS" ], "summary": "Удаление звука", "description": "Удаление звука. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "delete_api_sound", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ] } }, "/api/widget/rotate": { "post": { "tags": [ "OBS" ], "summary": "Ротация секретной OBS-ссылки", "description": "Ротация секретной OBS-ссылки. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "post_api_widget_rotate", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ] } }, "/api/widget/test": { "post": { "tags": [ "OBS" ], "summary": "Тестовый OBS alert", "description": "Тестовый OBS alert. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "post_api_widget_test", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ] } }, "/api/widget/{token}/config": { "get": { "tags": [ "OBS" ], "summary": "Конфигурация OBS-виджета", "description": "Конфигурация OBS-виджета. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "get_api_widget_token_config", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "parameters": [ { "name": "token", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/widget/{token}/events": { "get": { "tags": [ "OBS" ], "summary": "SSE-события OBS-виджета", "description": "Долгоживущий SSE-поток для OBS Browser Source. Виджет сам ставит alerts в очередь.", "operationId": "get_api_widget_token_events", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "parameters": [ { "name": "token", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/public/creators/{slug}": { "get": { "tags": [ "Донаты" ], "summary": "Публичная страница стримера", "description": "Публичная страница стримера. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "get_api_public_creators_slug", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "parameters": [ { "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/public/donations": { "post": { "tags": [ "Донаты" ], "summary": "Создание доната", "description": "Создает Gateway invoice с комиссией 5%. cover_fee=false удерживает комиссию из суммы; cover_fee=true точно увеличивает платеж так, чтобы стример получил введенную сумму после комиссии. Все расчеты выполняются в atomic без float.", "operationId": "post_api_public_donations", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" }, "example": { "slug": "my-channel", "donor_name": "Anonymous", "message": "Great stream!", "asset": "USDT", "network": "tron", "amount": "25.5", "cover_fee": true } } } } } }, "/api/public/donations/{token}/status": { "get": { "tags": [ "Донаты" ], "summary": "Статус доната", "description": "Статус доната. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "get_api_public_donations_token_status", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "parameters": [ { "name": "token", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/withdrawals": { "post": { "tags": [ "Вывод" ], "summary": "Запрос вывода", "description": "Резервирует баланс и запускает новый Messenger Device Flow с описанием суммы и адреса.", "operationId": "post_api_withdrawals", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" }, "example": { "asset": "USDT", "network": "tron", "amount": "10", "address": "TExampleRecipientAddress" } } } } } }, "/api/withdrawals/{flow}/poll": { "get": { "tags": [ "Вывод" ], "summary": "Подтверждение вывода через Messenger", "description": "После свайпа тем же Messenger-пользователем идемпотентно отправляет withdrawal в Gateway.", "operationId": "get_api_withdrawals_flow_poll", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ], "parameters": [ { "name": "flow", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/admin/status": { "get": { "tags": [ "Оператор" ], "summary": "Статус Donation Service", "description": "Статус Donation Service. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "get_api_admin_status", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ] } }, "/api/admin/creators/{creator_id}/blocked": { "patch": { "tags": [ "Оператор" ], "summary": "Блокировка страницы стримера", "description": "Блокировка страницы стримера. Возвращает JSON-ответ или стандартную JSON-ошибку.", "operationId": "patch_api_admin_creators_creator_id_blocked", "responses": { "200": { "description": "Успешный ответ" }, "400": { "description": "Ошибка запроса" }, "401": { "description": "Ошибка авторизации" } }, "security": [ { "sessionCookie": [] } ], "parameters": [ { "name": "creator_id", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" }, "example": { "blocked": true } } } } } } }, "components": { "securitySchemes": { "sessionCookie": { "type": "apiKey", "in": "cookie", "name": "ove_donations_session", "description": "HttpOnly session; changing requests also require X-CSRF-Token." } }, "schemas": { "Error": { "type": "object", "properties": { "error": { "type": "string" } }, "required": [ "error" ] } } } }