К содержимому

REST API

Звонки (LiveKit)

Аудио/видеозвонки через LiveKit: начало, подключение, пинг, завершение, диагностика.

Звонки идут через медиасервер LiveKit; API выдаёт токены комнаты и хранит состояние. Схема: звонящий call/start → вызываемые получают CallStarted (+ FCM type=call) → вызываемый call/token (звонящий получает CallAnswered) → оба подключаются к LiveKit по url + token и шлют call/ping → call/end (все получают CallEnded). В каналах звонков нет.

Методы#

GET /api/calls/config #

Конфигурация звонков

Bearer-токен

Доступность LiveKit, URL сервера, время звонка и TTL токена.

Параметры

Без параметров.

Запрос

curl
curl 'https://minchatapp.com/api/calls/config' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Ответ

HTTP 200
{
  "enabled": false,
  "url": "",
  "ring_ttl": 45,
  "token_ttl": 3600
}
POST /api/conversations/{conversation}/call/start #

Начать звонок

Bearer-токен Лимит: 30/min

Личные чаты и группы (канал → 400). Возвращает LiveKit token, url, room, call_id. Если звонок уже идёт — повторное подключение (rejoined:true). Если абонент недоступен — звонок сразу завершается (callee_reachable:false, reason:"unavailable"). Вызываемые получают CallStarted и FCM-пуш type=call.

Параметры

Имя Тип Описание
conversation
обязательный путь
integer
id чата.
mode
необязательный тело
string
audio (по умолчанию) или video.
one of: audio, video

Запрос

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/call/start' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"mode": "video"}'

Ответ

HTTP 503
{
  "success": false,
  "code": "call.unavailable",
  "error": "Calls are temporarily unavailable",
  "message": "Calls are temporarily unavailable"
}
GET /api/conversations/{conversation}/call/token #

Подключиться к звонку

Bearer-токен

Токен активного звонка (ответ). 404 call.none_active, если звонка нет. Звонящий получает CallAnswered.

Параметры

Имя Тип Описание
conversation
обязательный путь
integer
id чата.

Запрос

curl
curl 'https://minchatapp.com/api/conversations/12/call/token' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Ответ

HTTP 503
{
  "success": false,
  "code": "call.unavailable",
  "error": "Calls are temporarily unavailable",
  "message": "Calls are temporarily unavailable"
}
GET /api/conversations/{conversation}/call/token/refresh #

Обновить токен звонка

Bearer-токен

Новый JWT без побочных эффектов (без отметки «ответил»).

Параметры

Имя Тип Описание
conversation
обязательный путь
integer
id чата.

Запрос

curl
curl 'https://minchatapp.com/api/conversations/12/call/token/refresh' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Ответ

Отвечает HTTP 200.

POST /api/conversations/{conversation}/call/ping #

Пинг звонка

Bearer-токен Лимит: 240/min

Отправляйте раз в несколько секунд во время звонка; active:false — звонок завершён.

Параметры

Имя Тип Описание
conversation
обязательный путь
integer
id чата.
call_id
обязательный тело
string
id звонка из call/start / CallStarted.

Запрос

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/call/ping' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"call_id": "<uuid>"}'

Ответ

Отвечает HTTP 200.

POST /api/conversations/{conversation}/call/stats #

Отчёт о качестве звонка

Bearer-токен Лимит: 60/min

Логируется на сервере.

Параметры

Имя Тип Описание
conversation
обязательный путь
integer
id чата.
call_id
необязательный тело
string
id звонка из call/start / CallStarted.
duration
необязательный тело
integer
Длительность в секундах.
≥ 0
reconnects
необязательный тело
integer
Число переподключений.
≥ 0
ice
необязательный тело
string
Тип выбранного ICE-кандидата.
max 32 chars
loss
необязательный тело
number
Потери пакетов, %.
rtt
необязательный тело
number
RTT, мс.
jitter
необязательный тело
number
Джиттер, мс.

Запрос

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/call/stats' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"call_id": "<uuid>", "duration": 120, "rtt": 45.2}'

Ответ

Отвечает HTTP 200.

POST /api/conversations/{conversation}/call/end #

Завершить / отклонить звонок

Bearer-токен Лимит: 60/min

Завершается только указанный call_id. Все получают CallEnded.

Параметры

Имя Тип Описание
conversation
обязательный путь
integer
id чата.
call_id
необязательный тело
string
id звонка из call/start / CallStarted.
reason
необязательный тело
string
Причина завершения.
one of: ended, cancelled, declined, timeout, busy
duration
необязательный тело
integer
Длительность в секундах.
≥ 0

Запрос

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/call/end' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"call_id": "<uuid>", "reason": "ended", "duration": 120}'

Ответ

Отвечает HTTP 200.

POST /api/calls/connect-report #

Диагностика соединения

Bearer-токен Лимит: 30/min

ICE/relay-диагностика с клиентов.

Параметры

Имя Тип Описание
call_id
необязательный тело
string
id звонка из call/start / CallStarted.
max 64 chars
conversation_id
необязательный тело
integer
id чата.
≥ 1
outcome
обязательный тело
string
Итог подключения.
one of: connected, failed, ice_failed, timeout, disconnected
phase
необязательный тело
string
Фаза подключения.
one of: connect, reconnect, in_call
platform
необязательный тело
string
Платформа клиента.
max 32 chars
client_version
необязательный тело
string
Версия приложения.
max 64 chars
attempts
необязательный тело
integer
Попытки подключения.
≥ 0≤ 50
elapsed_ms
необязательный тело
integer
Время подключения, мс.
≥ 0≤ 3600000
candidates_tried
необязательный тело
array
Опробованные типы ICE-кандидатов.
max 10 items
candidates_tried.*
необязательный тело
string
Тип кандидата.
one of: host, srflx, prflx, relay
relay_protocols
необязательный тело
array
Опробованные протоколы TURN.
max 5 items
relay_protocols.*
необязательный тело
string
Протокол.
one of: udp, tcp, tls
selected_local
необязательный тело
string
Выбранный локальный кандидат.
one of: host, srflx, prflx, relay
selected_remote
необязательный тело
string
Выбранный удалённый кандидат.
one of: host, srflx, prflx, relay
selected_relay_protocol
необязательный тело
string
Выбранный протокол relay.
one of: udp, tcp, tls
network_type
необязательный тело
string
Тип сети (wifi, cellular…).
max 32 chars
disconnect_reason
необязательный тело
string
Причина разрыва.
max 64 chars
error
необязательный тело
string
Текст ошибки.
max 500 chars

Запрос

curl
curl -X POST 'https://minchatapp.com/api/calls/connect-report' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"outcome": "connected", "phase": "connect", "platform": "web", "attempts": 1, "elapsed_ms": 840, "candidates_tried": ["host", "srflx"]}'

Ответ

HTTP 200
{
  "ok": true
}
POST /api/webhooks/livekit #

Webhook LiveKit (внутренний)

Подпись LiveKit Лимит: 120/min

Служебный endpoint для медиасервера LiveKit (room_finished снимает зависшие звонки). Аутентификация — JWT-подпись LiveKit; не для сторонних интеграций.

Параметры

Без параметров.

Запрос

curl
curl -X POST 'https://minchatapp.com/api/webhooks/livekit' \
  -H 'Accept: application/json'

Ответ

Отвечает HTTP 200.