МТС Линк API: как забирать записи встреч без ручной выгрузки

ИНСТРУКЦИЯ

МТС Линк API: как забирать записи встреч без ручной выгрузки

МТС Линк API записи отдаёт сам: методы v3 и вебхуки заменяют поход в кабинет за каждой встречей. Какие методы закрывают этот путь целиком и что нужно, чтобы текст встречи приходил без ручной выгрузки.

Сколько шагов проходит запись, прежде чем станет текстом

Запись встречи не лежит в кабинете готовым файлом. Сначала её ставят на конвертацию, потом ждут, потом скачивают mp4 и только потом отправляют на расшифровку — и так с каждой встречей. Пока встреч три в неделю, это привычная рутина; на тридцати появляется резонный вопрос: умеет ли МТС Линк API отдавать записи сам, без похода в кабинет за каждой.

Разница не в объёме кода, а в том, кто держит процесс в голове: слева это человек, справа — обработчик вебхука, который не забывает и не уходит в отпуск.

Что МТС Линк API умеет с записями

Работа с записями устроена в три приёма: найти запись, попросить платформу собрать из неё mp4, забрать ссылку на готовый файл. Плюс два метода для текста — если встроенная расшифровка у вас включена. Все адреса начинаются с userapi.mts-link.ru/v3, и в каждый запрос кладётся заголовок x-auth-token.

Что нужноЗапросЧто вернётся
Найти записи за периодGET /v3/recordsсписок записей: идентификатор, название, размер файла, ссылка
Поставить запись на конвертациюPOST /v3/records/{recordId}/conversionsидентификатор конвертации
Забрать готовый mp4GET /v3/fileSystem/file/{conversionId}downloadUrl — прямая ссылка на файл
Взять всё сконвертированное по встречеGET /v3/eventsessions/{eventSessionId}/converted-recordsмассив со ссылками downloadUrl
Посмотреть расшифровки встречиGET /v3/eventsessions/{eventSessionId}/transcript/listидентификаторы и статус: preparing, published, unpublished
Выгрузить расшифровку и саммариGET /v3/transcript/{transcriptId}реплики с именем участника и временем, объект summary

Первый метод — единственный, где легко промахнуться на ровном месте. У списка записей параметр from обязателен по смыслу: без него выборка идёт от текущей даты и времени, то есть возвращает пустоту, а разработчик полчаса ищет ошибку в авторизации. Рядом живут period (day, week, month, year), offset и limit — до 500 записей за запрос при значении по умолчанию 10. Для ночного дозапроса «что появилось за сутки» этого хватает с большим запасом.

Вебхуки: платформа сама говорит, что запись готова

Опрашивать список записей раз в 5 минут — самое частое и самое дорогое решение в такой интеграции. Посчитайте: 24 × 60 ÷ 5 = 288 запросов в сутки, больше 105 000 в год. При тридцати встречах в неделю новую запись покажут около 1 400 из них — примерно 1 %, остальные вернут то же, что и предыдущий. МТС Линк умеет сообщать о событиях сам. Вы регистрируете адрес своего обработчика, выбираете события — и платформа шлёт на него POST с телом в JSON, где всегда есть event (что случилось), occurredAt (когда, в формате ISO 8601) и объект data с идентификаторами.

  • eventSession.created — мероприятие создано. Пригодится, чтобы завести карточку встречи у себя заранее, до того как она началась.
  • recordFile.ready — онлайн-запись стала доступна. В data приезжают recordId и eventSessionId; с этого события и начинается вся автоматика.
  • convertedRecord.ready — конвертация закончена, mp4 собран. В data — convertedRecordId и тот же eventSessionId.
  • transcript.ready — готова текстовая расшифровка на стороне платформы, в теле приходит transcriptId.
  • Плюс события про ход самого мероприятия: старт, завершение, «все участники покинули мероприятие», регистрация участника, отправленное напоминание.
Светлые блоки платформа присылает сама, белые — два ваших запроса. Между первым и последним обычно проходят минуты, и всё это время никто ничего не ждёт у экрана.

Обработчик стоит открытым в интернет, поэтому каждый хук нужно проверять на подлинность. При создании вебхука задаётся секретная фраза, ею подписывается тело запроса, подпись приезжает в заголовке X-Webhook-Signature, алгоритм — HMAC SHA-256. Вы считаете HMAC от полученного тела своим секретом и сравниваете строки; в справке МТС Линк для этого лежат готовые примеры на PHP, Go, Ruby, JavaScript, TypeScript и Python. Приём универсальный: webhook о готовой расшифровке на нашей стороне подписывается так же и проверяется так же.

Почему mp4 не появляется сам: шаг конвертации

Онлайн-запись и файл mp4 — разные вещи, и это первая заминка почти в каждой интеграции. Событие recordFile.ready говорит только, что запись появилась в кабинете; чтобы получить файл, её надо поставить на конвертацию отдельным запросом. Обработчик, который сразу после первого хука идёт за ссылкой, стабильно получает пустоту и выглядит как «API не работает».

  1. Отправьте POST на records/{recordId}/conversions. В ответ придёт идентификатор конвертации — сохраните его рядом с идентификатором встречи, он понадобится на последнем шаге.
  2. Выберите качество. Параметр quality принимает 720 или 1080, по умолчанию 720. Для текста больше не нужно: распознаётся звук, а не картинка. Разница в весе считается от битрейта: типичные 1,5 Мбит/с для 720p дают 1 500 000 × 3600 ÷ 8 = 675 МБ за час, а 3 Мбит/с для 1080p — 1,35 ГБ. На тридцати часовых встречах в месяц это 20 ГБ против 40, и весь этот трафик едет через ваш сервер.
  3. Выберите раскладку. Параметр view задаёт, что попадёт в кадр: эфир, эфир с чатом, с вопросами, с боковой панелью, с видео ведущего. На расшифровку это не влияет — влияет на вес файла и на то, можно ли будет отдать это видео людям.
  4. Не запускайте конвертацию дважды. Если она уже идёт, метод отвечает 403: превышен лимит одновременных конвертаций. Повтор по таймауту делает только хуже — дождитесь события.
  5. Проверьте длительность. Записи длиннее 24 часов на конвертацию не принимаются, такую сначала подрезают в кабинете. Для суточных марафонов и вебинарных стримов это не теория.
  6. Дождитесь convertedRecord.ready — и только после него идите за ссылкой: методом fileSystem/file/{conversionId} или сразу по встрече, eventsessions/{eventSessionId}/converted-records. Оба отдают downloadUrl.

Как связать выгрузку с расшифровкой: маршрут целиком

Готовый mp4 сам по себе задачу не решает: искать по видео нельзя, читать его нельзя, в протокол он не превращается. Нужен текст — и вторая половина маршрута стыкуется с первой почти дословно, событие в событие. У нас для этого есть API расшифровки аудио и видео: POST с файлом или ссылкой, в ответ идентификатор задачи, на готовность — свой вебхук.

  1. Поднимите обработчик. Один эндпоинт, который принимает POST, проверяет подпись и быстро отвечает 2xx. Тяжёлую работу делайте после ответа, а не до него.
  2. Зарегистрируйте вебхуки recordFile.ready и convertedRecord.ready, задайте секретную фразу и сохраните её у себя рядом с ключом API.
  3. На recordFile.ready ставьте запись на конвертацию и запоминайте пару eventSessionId → conversionId.
  4. На convertedRecord.ready идите за downloadUrl — по conversionId или по eventSessionId, как удобнее вашей схеме хранения.
  5. Отправьте запись на расшифровку — файлом или ссылкой. В ответ придёт идентификатор задачи, положите его в ту же строку, где лежат идентификаторы встречи.
  6. Дождитесь события transcript.completed — в нём тот же идентификатор задачи, по которому забирают результат.
  7. Заберите результат в нужном виде: JSON с репликами, спикерами и таймкодами — для системы, DOCX или PDF — для людей, SRT и VTT — если из встречи потом делают видео с субтитрами.
  1. Встреча закончиласьплатформа дописывает запись
  2. recordFile.readyставим на конвертацию
  3. convertedRecord.readyберём ссылку, шлём на расшифровку
  4. transcript.completedтекст, протокол и задачи у вас

Отдельно стоит подумать, что вы храните у себя. Минимум — четыре поля в одной строке: eventSessionId, conversionId, идентификатор задачи на расшифровку и статус. Этого достаточно, чтобы через месяц ответить на два вопроса, которые обязательно возникнут: «почему по этой встрече нет текста» и «не отправили ли мы её дважды».

Чек-лист запуска интеграции
Тариф с разделом API: PRO / Enterprise / Total — ___
Ключ заведён отдельный под интеграцию, не общий с отделами: да / нет
Заголовок x-auth-token уходит во всех запросах: проверено
Секретная фраза вебхука сохранена рядом с ключом: ___
Проверка X-Webhook-Signature (HMAC SHA-256) включена до разбора тела: да / нет
Обработчик отвечает 2xx раньше, чем начинает качать файл: да / нет
Подписки: recordFile.ready, convertedRecord.ready, transcript.ready — ___
Ключ идемпотентности: eventSessionId
Таблица: eventSessionId | conversionId | id задачи расшифровки | статус | дата
Страховка: один ночной GET /v3/records с параметром from за прошедшие сутки
Мониторим: ответы 403 от API и встречи без текста старше 24 часов
Кому приходит письмо, когда сутки без текста: ___

Две последние строки дописывают уже после запуска и всегда по одной причине: интеграция ломается тихо, и без них о поломке узнают на планёрке через неделю.

Загрузка записи встречи по прямой ссылке — файл не нужно скачивать на компьютер
Приём с прямой ссылкой работает и без всякого API: если запись отдаётся по ссылке, скачивать её себе не нужно — сервис заберёт файл сам.

Что приходит на выходе, кроме видеофайла

На этом месте автоматизация обычно и оправдывает себя. Из записи получается не одна простыня текста, а несколько документов разного назначения — и все они появляются раньше, чем участники успевают дойти до следующей встречи.

Реплики расшифровки встречи из МТС Линк: у каждой метка говорящего и таймкод — «Спикер 1 · 00:02–00:03», «Спикер 2 · 00:04–00:05»
Реплики разложены по говорящим, у каждой стоит время от начала записи. Имена подставляются из самого разговора: если участники представились, вместо «Спикер 2» появится Ирина.

Разделение спикеров здесь идёт по голосу, а не по учётным записям, — и это важнее, чем кажется. На встречах в переговорке с одного ноутбука сидит полкоманды, а гости часто заходят по ссылке без имени; для платформы это один участник, для расшифровки — три разных голоса.

Протокол вместо простыниИтог встречи, решения и задачи с владельцами и сроками — каждый пункт со ссылкой на секунду, где это прозвучало.
Ответы по записиЧат по встрече: спрашиваете своими словами, получаете ответ с прямой цитатой и таймкодом.
Архив, в котором ищутПоиск сразу по всем расшифровкам: в каком созвоне обсуждали бюджет и кто обещал прислать смету.
Структура смарт-отчёта по встрече: пять разделов — короткий TL;DR, ключевые моменты, принятые решения, задачи с владельцами и сроками, ближайшие шаги
Тот документ, ради которого всё и затевалось: пять разделов вместо часовой записи. Его читают те, кто на встрече не был, а полная расшифровка лежит рядом на случай спора.

У самой платформы расшифровка тоже есть, но доступна она не всем и не в каждом формате мероприятия — где её включить и почему она иногда не появляется, разобрано отдельно: встроенная расшифровка встречи в МТС Линк. Если она у вас работает, забирать её можно тем же способом, вебхуком transcript.ready и методом transcript/{transcriptId}: в ответе придут реплики с именем участника и временем плюс объект summary со своим статусом — inProgress, completed или failed.

Пять мест, где связка ломается

Сама интеграция несложная, но ломается она предсказуемо и всегда тихо: никто не падает с ошибкой, просто в один день текст перестаёт приходить, а замечают это через неделю на планёрке. Пять типовых причин, по которым стоит пройтись до того, как что-то встанет.

  1. 403 на ровном месте. Ключ работает от имени владельца аккаунта: сменился тариф — API молча закрылся. Первым делом проверяют не код, а раздел API в кабинете.
  2. Пустой список записей. Забытый параметр from — и выборка идёт от текущего момента. Ответ формально успешный, записей ноль.
  3. Повторная конвертация. Второй POST по той же записи вернёт 403, потому что первая ещё идёт. Ретрай по таймауту здесь не помогает, помогает ожидание события.
  4. Дубли вебхуков. Один и тот же хук может прийти дважды — это норма для любой доставки «хотя бы один раз», а не сбой. Обработчик должен быть идемпотентным.
  5. Медленный ответ обработчика. Если вы качаете часовое видео до того, как ответили 2xx, обработчик рискует не уложиться в таймаут отправителя — и тогда тот же хук прилетает снова, а вы качаете видео второй раз. Сначала ответ, потом работа.
Ключ идемпотентности — eventSessionId: по нему проверяют, не заводили ли задачу раньше. Повторная отправка того же файла обработку заново не запускает, но лишние строки в базе появляются легко.

Если ключа API нет: тот же маршрут вручную

Раздел API появляется не на всех тарифах, и это не повод отказываться от текста встреч. Ручной маршрут короче, чем кажется, и на нём же обкатывают весь сценарий, прежде чем звать разработчика.

  • Поставьте запись на конвертацию в кабинете и заберите файл — порядок действий, сроки хранения и типичные ошибки собраны в отдельном разборе: скачать запись встречи из МТС Линк вручную.
  • Не скачивайте, если можно не скачивать: запись, доступную по прямой ссылке, сервис забирает сам — остаётся вставить адрес.
  • Проверьте, что вы получите на выходе, на одной настоящей встрече: текст встречи из МТС Линк с протоколом и задачами собирается за несколько минут и без карты.
Встреч в неделюКак забирать записиЧто для этого нужно
До пятиРуками: конвертация в кабинете, файл или прямая ссылка в сервисдоступ к записям, 5 минут на встречу
Пять — двадцатьРуками, но по регламенту: кто забирает, куда кладёт, в какой срокдоговорённость в команде и общий архив расшифровок
Больше двадцатиВебхуки и два запроса к APIтариф с разделом API и примерно день работы разработчика

Цена ручного маршрута считается прямо по этой таблице. 5 минут на встречу при 30 встречах в неделю — это 150 минут, 2,5 часа в неделю и около 115 часов в год: почти три рабочие недели, потраченные на конвертацию и перекладывание файлов. День работы разработчика на верхней строке окупается на втором месяце.

Порог, за которым автоматизацию стоит собирать всерьёз, у всех свой, но ориентир простой: как только одинаковый маршрут повторяется чаще пяти раз в неделю, ручные шаги начинают теряться — не потому, что люди небрежны, а потому, что встреча заканчивается ровно тогда, когда все спешат на следующую.

Записи есть, текста нет

Подключите расшифровку по API: POST с файлом или ссылкой, вебхук о готовности, JSON со спикерами и таймкодами. Или проверьте результат руками — на одной записи из МТС Линк, без интеграции.

Открыть API расшифровки

Бесплатный старт без карты, файлы до 4 ГБ и до 6 часов. Экспорт: DOCX, PDF, TXT, Markdown, JSON, SRT, VTT.

Частые вопросы

Как настроить автоматическую выгрузку записей МТС Линк?

Через связку из двух вебхуков и двух запросов. Зарегистрируйте обработчик и подпишитесь на recordFile.ready и convertedRecord.ready. На первое событие отправляйте POST на records/{recordId}/conversions — платформа начнёт собирать mp4. На второе забирайте downloadUrl методом fileSystem/file/{conversionId} и отдавайте запись на расшифровку. Опрос списка записей по расписанию оставьте как страховку на случай, если хук не дошёл, — одного запроса в сутки для этого достаточно.

На каких тарифах работает интеграция с МТС Линк по API?

По справке платформы ключ API доступен на тарифах PRO, Enterprise и Total; на остальных раздел с ключом просто не появляется. Если тариф отключить, ключ перестаёт работать и запросы начинают отвечать 403 — это первое, что стоит проверить, когда интеграция встала, а в коде ничего не меняли. Ключей можно завести несколько, с разными правами.

Можно ли обойтись без вебхуков и просто опрашивать API?

Можно, но это медленнее и дороже: между окончанием встречи и появлением файла проходит неопределённое время, и вы либо опрашиваете часто и впустую, либо редко и с задержкой. Плюс у метода списка записей обязателен параметр from — без него выборка идёт от текущего момента и возвращает пустой список. Разумный компромисс: вебхуки как основной путь и один ночной запрос за прошедшие сутки как страховка.

Чем расшифровка из API МТС Линк отличается от отдельного сервиса?

Встроенная отдаёт реплики с именем участника, временем и объект саммари со статусом — этого хватает, чтобы прочитать встречу. Отдельный сервис нужен, когда текст живёт дальше: разделение спикеров по голосу для тех, кто зашёл с одного ноутбука или по ссылке без имени, протокол с решениями и задачами, экспорт в DOCX, SRT и VTT, поиск сразу по всему архиву встреч и ответы по записи с цитатами и таймкодами.

Что делать, если один и тот же вебхук пришёл дважды?

Считать это нормой и делать обработчик идемпотентным. Ключом берите eventSessionId: перед тем как ставить конвертацию или заводить задачу на расшифровку, проверьте, нет ли уже строки с таким идентификатором. Повторная отправка того же файла обработку заново не запускает, но дубликаты в вашей базе появляются легко и портят отчётность.

Как проверить, что вебхук пришёл именно из МТС Линк?

По подписи. При создании вебхука задаётся секретная фраза, ею подписывается тело запроса, а подпись приходит в заголовке X-Webhook-Signature; алгоритм — HMAC SHA-256. Вы считаете HMAC от полученного тела своим секретом и сравниваете строки, не доверяя ничему из тела до проверки. В справке платформы есть готовые примеры на PHP, Go, Ruby, JavaScript, TypeScript и Python.

Нужен ли программист, чтобы собрать такую связку?

Для варианта с вебхуками — да, хотя работы там примерно на день: один эндпоинт, проверка подписи, два запроса к платформе, один к сервису расшифровки и таблица с идентификаторами. Без разработки остаётся ручной маршрут: конвертация в кабинете, скачивание файла или прямая ссылка, загрузка в сервис. На одну встречу это пять минут, и на нём удобно проверить сценарий целиком, прежде чем что-то писать.

Проверено 14 августа 2026 по базе знаний МТС Линк, раздел «API и Webhooks»: «Интеграция API. С чего начать» (ключ, заголовок x-auth-token, тарифы PRO / Enterprise / Total), «Получить список онлайн-записей» (параметры from, period, offset, limit), «Поставить запись на конвертацию» (quality, view, ограничение на 24 часа и ответ 403 при повторном запуске), «Получить сконвертированную запись, используя EventsessionID» и «Скачать готовую MP4-запись» (downloadUrl), «Выгрузить список текстовых расшифровок» и «Выгрузить саммаризацию и текстовую расшифровку», описания вебхуков recordFile.ready, convertedRecord.ready, transcript.ready и eventSession.created, а также «Webhooks. Проверка достоверности хука» (заголовок X-Webhook-Signature, HMAC SHA-256).