Запись разговора отдаётся подписанной ссылкой с ограниченным сроком жизни. Ссылку выдаёт API звонков — ту же схему уже использует интерфейс платформы. Скачивать файл нужно по этой ссылке как есть, отдельной авторизации на скачивание нет: доступ подтверждает подпись в query.
Где взять ссылку
Нужна авторизация платформы.
recordUrl — основная дорожка. recordUrlStereo — стереодорожка (каналы раздельно). Стерео есть не у каждого звонка: ссылка приходит всегда, но файл может отсутствовать, это 404.
Имя стереофайла входит в подпись. Собрать recordUrlStereo из recordUrl на своей стороне нельзя — берите значение из ответа GET /v2/calls/{id}.
То же поле call.recordUrl приходит в теле вебхука. Если там ещё старый адрес /api/process-record-url, это временная форма: она будет отключена. Новые интеграции читают подписанную ссылку.
Формат ссылки
- Путь:
/call/<имя файла>.mp3. Файл всегда в MP3.
- Срок жизни — 24 часа с момента
X-Amz-Date. В ссылке это X-Amz-Expires=86400 (секунды).
- Подпись покрывает хост, путь и query целиком.
Не меняйте хост, путь и query и не пересобирайте ссылку из частей. Любая правка делает подпись недействительной, и скачивание ответит 403.
Ссылку нельзя сохранять как постоянный адрес записи. Перед воспроизведением запрашивайте звонок заново, если с момента выдачи прошло близко к суткам или скачивание уже вернуло 403.
Как скачивать
Запрос — GET по ссылке. Метод входит в подпись: HEAD по той же ссылке отвечает 403, даже если файл на месте.
Перемотка и докачка — заголовок Range. Query при этом не трогайте.
Ответ 206 и заголовок Content-Range означают, что сервер отдал запрошенный фрагмент. Плеер может перематывать запись, не скачивая файл целиком.
Чтобы проверить, что файл существует, не вызывайте HEAD. Отправьте GET с Range: bytes=0-0: живой файл отвечает 206.
Если ссылка истекла
403 на скачивании значит, что подпись не принята: срок вышел или ссылку изменили. Повтор того же URL ничего не даст.
Запросите звонок ещё раз — GET /v2/calls/{id} — и скачивайте новый recordUrl.
Коды ответа
Коды относятся к запросу по подписанной ссылке, не к GET /v2/calls.
Старый адрес записи
Адрес вида
устарел и будет отключён. Он не требует подписи и не является постоянным API.
Новый код не должен его вызывать и не должен собирать такой URL из имени файла. Берите recordUrl из GET /v2/calls или из вебхука и скачивайте подписанную ссылку по правилам выше.