REST API
Звонки (LiveKit)
Аудио/видеозвонки через LiveKit: начало, подключение, пинг, завершение, диагностика.
Звонки идут через медиасервер LiveKit; API выдаёт токены комнаты и хранит состояние. Схема: звонящий call/start → вызываемые получают CallStarted (+ FCM type=call) → вызываемый call/token (звонящий получает CallAnswered) → оба подключаются к LiveKit по url + token и шлют call/ping → call/end (все получают CallEnded). В каналах звонков нет.
Методы#
Конфигурация звонков
Доступность LiveKit, URL сервера, время звонка и TTL токена.
Параметры
Без параметров.
Запрос
curl 'https://minchatapp.com/api/calls/config' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Ответ
{
"enabled": false,
"url": "",
"ring_ttl": 45,
"token_ttl": 3600
}
Начать звонок
Личные чаты и группы (канал → 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 -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"}'
Ответ
{
"success": false,
"code": "call.unavailable",
"error": "Calls are temporarily unavailable",
"message": "Calls are temporarily unavailable"
}
Подключиться к звонку
Токен активного звонка (ответ). 404 call.none_active, если звонка нет. Звонящий получает CallAnswered.
Параметры
| Имя | Тип | Описание |
|---|---|---|
conversation
обязательный путь
|
integer |
id чата. |
Запрос
curl 'https://minchatapp.com/api/conversations/12/call/token' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Ответ
{
"success": false,
"code": "call.unavailable",
"error": "Calls are temporarily unavailable",
"message": "Calls are temporarily unavailable"
}
Обновить токен звонка
Новый JWT без побочных эффектов (без отметки «ответил»).
Параметры
| Имя | Тип | Описание |
|---|---|---|
conversation
обязательный путь
|
integer |
id чата. |
Запрос
curl 'https://minchatapp.com/api/conversations/12/call/token/refresh' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Ответ
Отвечает HTTP 200.
Пинг звонка
Отправляйте раз в несколько секунд во время звонка; active:false — звонок завершён.
Параметры
| Имя | Тип | Описание |
|---|---|---|
conversation
обязательный путь
|
integer |
id чата. |
call_id
обязательный тело
|
string |
id звонка из call/start / CallStarted. |
Запрос
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.
Отчёт о качестве звонка
Логируется на сервере.
Параметры
| Имя | Тип | Описание |
|---|---|---|
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 -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.
Завершить / отклонить звонок
Завершается только указанный 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 -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.
Диагностика соединения
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 -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"]}'
Ответ
{
"ok": true
}
Webhook LiveKit (внутренний)
Служебный endpoint для медиасервера LiveKit (room_finished снимает зависшие звонки). Аутентификация — JWT-подпись LiveKit; не для сторонних интеграций.
Параметры
Без параметров.
Запрос
curl -X POST 'https://minchatapp.com/api/webhooks/livekit' \
-H 'Accept: application/json'
Ответ
Отвечает HTTP 200.