Главная Помощь Открыть MTB

MTB API Documentation

Добро пожаловать в документацию MTB API. Здесь описаны все доступные эндпоинты, WebSocket Gateway события, OAuth2 авторизация и примеры использования.

Base URL: https://api.metalib.xyz — Все API запросы отправляются на этот адрес.

Быстрый старт

Для начала работы с API тебе нужен токен авторизации. Получи его через OAuth2 или используй токен бота.

GET Пример запроса
curl -X GET https://api.metalib.xyz/api/users/@me \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json"
Ответ
{
  "id": "1476197534295711744",
  "username": "player",
  "discriminator": "0",
  "avatar": "a1b2c3d4e5f6",
  "email": "player@example.com",
  "flags": 0,
  "premium_type": 0
}

Форматы данных

  • Все запросы и ответы используют JSON
  • ID объектов — строки (Snowflake формат)
  • Даты в формате ISO 8601
  • Content-Type: application/json

Версионирование

Текущая версия API: v1. API обратно совместимо — мы не удаляем поля без предупреждения.

Аутентификация

Все запросы к API должны включать заголовок Authorization с токеном доступа.

Типы токенов

TOKEN Пользовательский токен
Получается при входе через OAuth2. Используется для действий от имени пользователя.
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
BOT Токен бота
Создаётся в панели разработчика. Используется для ботов и интеграций.
Authorization: Bot MTB.xxxxxxxxxxxxxxxxxxxx

Получение токена

POST /api/auth/login
Авторизация по email и паролю. Возвращает токен доступа.
ПараметрТипОписание
email*stringEmail пользователя
password*stringПароль
{
  "token": "mtb_RBkMGBy7FRlyL7Gl..."
}

Никогда не передавай токен третьим лицам. Если токен скомпрометирован — немедленно смени пароль.

Rate Limits

API использует rate limiting для предотвращения злоупотреблений. Превышение лимита вернёт статус 429 Too Many Requests.

Заголовки

ЗаголовокТипОписание
X-RateLimit-LimitintМаксимум запросов в окне
X-RateLimit-RemainingintОставшиеся запросы
X-RateLimit-ResetfloatUnix timestamp сброса лимита
X-RateLimit-BucketstringУникальный ID bucket'а
Retry-AfterintСекунд до следующего запроса (при 429)

Стратегия

  • Глобальный лимит: 50 запросов/секунду
  • Per-route лимиты зависят от эндпоинта
  • При получении 429 — ждать Retry-After секунд

Совет: используй заголовки rate limit для проактивного throttling вместо ожидания ошибки 429.

Users

Эндпоинты для работы с пользователями.

GET /api/users/@me
Возвращает текущего авторизованного пользователя.
{
  "id": "1476197534295711744",
  "username": "player",
  "discriminator": "0",
  "avatar": "a1b2c3d4e5f6",
  "email": "player@example.com",
  "verified": true,
  "flags": 0
}
GET /api/users/{user_id}
Возвращает информацию о пользователе по ID.
ПараметрТипОписание
user_id*snowflakeID пользователя
PATCH /api/users/@me
Обновить профиль текущего пользователя.
ПараметрТипОписание
usernamestringНовое имя (2-32 символа)
avatarstringBase64 изображение аватара

Guilds (Серверы)

Эндпоинты для управления серверами.

GET /api/guilds/{guild_id}
Информация о сервере.
{
  "id": "1476200000000000000",
  "name": "Gamers Hub",
  "icon": "abc123def456",
  "owner_id": "1476197534295711744",
  "member_count": 42,
  "channels": [...]
}
POST /api/guilds
Создать новый сервер.
ПараметрТипОписание
name*stringНазвание сервера (2-100 символов)
iconstringBase64 изображение иконки
DELETE /api/guilds/{guild_id}
Удалить сервер. Только для владельца.

Channels

Эндпоинты для работы с каналами.

GET /api/channels/{channel_id}
Информация о канале.

Типы каналов

ТипЗначениеОписание
GUILD_TEXT0Текстовый канал сервера
DM1Личные сообщения
GUILD_VOICE2Голосовой канал
GROUP_DM3Групповые ЛС
GUILD_CATEGORY4Категория каналов

Messages

Отправка и получение сообщений.

GET /api/channels/{channel_id}/messages
Получить сообщения канала. Макс. 100 за запрос.
QueryТипОписание
limitint1-100, по умолчанию 50
beforesnowflakeСообщения до этого ID
aftersnowflakeСообщения после этого ID
POST /api/channels/{channel_id}/messages
Отправить сообщение в канал.
ПараметрТипОписание
content*stringТекст (до 2000 символов)
noncestringУникальный ID для дедупликации
ttsboolText-to-speech
// Пример
POST /api/channels/123456/messages
{
  "content": "Привет! 🚀"
}
DELETE /api/channels/{channel_id}/messages/{message_id}
Удалить сообщение. Свои — всегда, чужие — с правами MANAGE_MESSAGES.

Invites

Управление ссылками-приглашениями.

GET /api/invites/{code}
Информация о приглашении по коду.
POST /api/channels/{channel_id}/invites
Создать приглашение в канал.
ПараметрТипОписание
max_ageintВремя жизни в секундах (0 = бессрочно)
max_usesintМакс. использований (0 = безлим.)

WebSocket Gateway

Real-time соединение для получения событий. Подключение через WebSocket.

Gateway URL: wss://web.metalib.xyz/gateway

Подключение

const ws = new WebSocket('wss://web.metalib.xyz/gateway');

ws.onopen = () => {
  // Отправить IDENTIFY
  ws.send(JSON.stringify({
    op: 2,
    d: {
      token: "YOUR_TOKEN",
      properties: {
        os: "linux",
        browser: "chrome",
        device: ""
      }
    }
  }));
};

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Event:', data.t, data.d);
};

Opcodes

CodeНазваниеОписание
0DispatchСобытие от сервера
1HeartbeatПоддержание соединения
2IdentifyАвторизация при подключении
7ReconnectСервер просит переподключиться
9Invalid SessionСессия недействительна
10Helloheartbeat_interval при подключении
11Heartbeat ACKОтвет на heartbeat

Heartbeat

После получения op: 10 (Hello) начинай отправлять heartbeat с указанным интервалом:

// Heartbeat каждые heartbeat_interval мс
setInterval(() => {
  ws.send(JSON.stringify({ op: 1, d: lastSequence }));
}, heartbeatInterval);

Gateway Events

События, получаемые через WebSocket Gateway.

Основные события

СобытиеОписание
READYНачальные данные после IDENTIFY
MESSAGE_CREATEНовое сообщение
MESSAGE_UPDATEСообщение отредактировано
MESSAGE_DELETEСообщение удалено
GUILD_CREATEПрисоединение к серверу
GUILD_DELETEВыход с сервера
CHANNEL_CREATEСоздан новый канал
CHANNEL_UPDATEКанал обновлён
CHANNEL_DELETEКанал удалён
TYPING_STARTПользователь печатает
PRESENCE_UPDATEОбновление статуса
VOICE_STATE_UPDATEИзменение голосового состояния
GUILD_MEMBER_ADDНовый участник сервера
GUILD_MEMBER_REMOVEУчастник покинул сервер

Пример MESSAGE_CREATE

{
  "t": "MESSAGE_CREATE",
  "s": 42,
  "op": 0,
  "d": {
    "id": "1476300000000000000",
    "channel_id": "1476200000000000001",
    "author": {
      "id": "1476197534295711744",
      "username": "player"
    },
    "content": "Привет всем! 👋",
    "timestamp": "2026-02-25T12:00:00.000Z"
  }
}

OAuth2

Авторизация сторонних приложений через OAuth2.

Authorize Flow

  1. Перенаправь пользователя на /oauth2/authorize
  2. Пользователь разрешает доступ
  3. Получаешь code на redirect_uri
  4. Обмениваешь code на access_token
GET /oauth2/authorize
Страница авторизации OAuth2.
QueryТипОписание
client_id*snowflakeID приложения
redirect_uri*stringURL для callback
response_type*stringВсегда code
scope*stringЗапрашиваемые права

Scopes

ScopeОписание
identifyБазовая информация (id, username, avatar)
email+ адрес email
guildsСписок серверов пользователя
guilds.joinДобавление на сервер
messages.readЧтение сообщений

Коды ошибок

API возвращает стандартные HTTP статус-коды и дополнительные коды ошибок MTB.

HTTP статус-коды

КодОписание
200OK — Запрос выполнен
201Created — Ресурс создан
204No Content — Успех без тела ответа
400Bad Request — Некорректный запрос
401Unauthorized — Не авторизован
403Forbidden — Недостаточно прав
404Not Found — Ресурс не найден
429Too Many Requests — Rate limit
500Internal Server Error
502Gateway Unavailable

Формат ошибки

{
  "code": 50001,
  "message": "Missing Access",
  "errors": {}
}

Коды ошибок MTB

КодОписание
10001Unknown Account
10003Unknown Channel
10004Unknown Guild
10008Unknown Message
30001Maximum guilds reached
40001Unauthorized — invalid token
50001Missing Access
50013Missing Permissions
50035Invalid Form Body