COSMOSCRIBE
Начать
Справочник для разработчиков

Документация API

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

Базовый URL
https://cosmoscribe.ru/api/v1
Версия
v1 · 1.0.0
Аутентификация
X-API-Key
Пять минут

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

От пустого проекта до готовой расшифровки — четыре шага. Всё, что нужно из инструментов, — curl.

  1. 1

    Выпустите ключ

    Профиль → «Безопасность» → «API-ключи» → «Выпустить ключ». Ключ показывается один раз: мы храним только его отпечаток, восстановить значение невозможно. Раздел доступен на тарифе «Бизнес» — программный доступ входит именно в него.

  2. 2

    Проверьте ключ

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

    bash
    export COSMIC_API_KEY="csk_ваш_ключ"
    
    curl https://cosmoscribe.ru/api/v1/account \
      -H "X-API-Key: $COSMIC_API_KEY"
  3. 3

    Отправьте запись

    Ответ приходит сразу, до окончания обработки: в нём log_id и статус queued. Сохраните log_id — по нему забирается результат.

    bash
    curl -X POST https://cosmoscribe.ru/api/v1/transcriptions \
      -H "X-API-Key: $COSMIC_API_KEY" \
      -H "Idempotency-Key: order-1042" \
      -F "file=@meeting.mp3" \
      -F "language=auto" \
      -F "webhook_url=https://example.ru/hooks/cosmic"
  4. 4

    Заберите результат

    Правильный способ — вебхук: сервис сам постучится на ваш адрес, когда запись готова. Если принимать входящие запросы негде, опрашивайте статус — но не чаще одного раза в 10–15 секунд.

    bash
    curl https://cosmoscribe.ru/api/v1/transcriptions/$LOG_ID \
      -H "X-API-Key: $COSMIC_API_KEY"
    
    curl "https://cosmoscribe.ru/api/v1/transcriptions/$LOG_ID/export?format=srt" \
      -H "X-API-Key: $COSMIC_API_KEY" -o meeting.srt

Машинная спецификация

Спецификация OpenAPI 3.1 собирается из того же описания методов, что и эта страница, поэтому не расходится с реальностью. Импортируйте её в Postman, Insomnia или генератор клиентов — коллекция и SDK получатся сами.

openapi.json
Ключи

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

Постоянный ключ вида csk_… — без OAuth, без истекающих токенов и без обновления по расписанию. Ключ действует, пока вы его не отзовёте.

Заголовок Значение Описание
X-API-Key csk_… Основной способ: ключ передаётся как есть, без префиксов.
Authorization Bearer csk_… Альтернатива для клиентов и SDK, которые умеют только Bearer.

Что важно знать

  • Ключ равен доступу ко всем записям аккаунта. Держите его в переменных окружения или в менеджере секретов, не в репозитории и не в мобильном приложении.
  • Значение показывается один раз при выпуске. В базе лежит только отпечаток, поэтому потерянный ключ не восстанавливается — выпустите новый и отзовите старый.
  • Отзыв мгновенный и необратимый: отозванный ключ сразу получает 401, включить его обратно нельзя.
  • Ключей можно держать несколько — по одному на среду или на интеграцию. Тогда компрометация одного не останавливает остальные.
  • Белый список IP настраивается на каждый ключ в профиле: адреса и подсети в формате CIDR. Пустой список означает «с любого адреса».
  • Запросы с ключом видят только записи своего аккаунта; на чужие приходит 403 или 404.
Базовые правила

Соглашения

Одинаково устроено во всех методах — дальше в справочнике это не повторяется.

Асинхронная обработка

Методы создания отвечают 202 и идентификатором, не дожидаясь распознавания. Статус записи проходит путь queued → processing → completed или failed. Час записи обрабатывается заметно быстрее часа, но точное время зависит от длины и загрузки очереди.

Идентификаторы

Записи, краткие содержания, переводы и группы адресуются UUID. Записи словаря — целыми числами.

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

Загрузка файлов — multipart/form-data, остальные запросы с телом — JSON в UTF-8. Даты и время — ISO 8601 с явным часовым поясом: сервер отдаёт UTC, то есть смещение +00:00. Длительности — в секундах.

Ошибки

У любой ошибки есть поле message на русском; там, где случай различим машинно, добавляется поле code. У статуса 422 приходит ещё и errors с разбором по полям.

Усечение вместо отказа

Если запись длиннее остатка минут, она не отклоняется: расшифровывается доступная часть и в ответе приходит is_partial = true. Остаток дочитывается методом resume после пополнения минут — файл заново загружать не нужно.

Совместимость

Версия зафиксирована в пути: /api/v1. Внутри версии мы только добавляем поля и методы, поэтому разбирайте ответы устойчиво к появлению новых полей и не полагайтесь на их порядок.

Справочник

Методы

Полный список методов версии v1 с параметрами и кодами ответов. Все запросы требуют ключ.

Транскрибация

Создание записей, статус, результат и экспорт. Идентификаторы записей — UUID.

POST /api/v1/transcriptions

Загрузить файл

Принимает аудио или видео и ставит расшифровку в очередь.

Тело — multipart/form-data. Ответ приходит сразу, до окончания обработки: запись создаётся в статусе queued. Из видео на сервере остаётся только аудиодорожка. Лимит размера файла зависит от тарифа, для видео он выше — фактические значения возвращает GET /account.

Параметры
Параметр Тип Обяз. Описание
file
в форме
file да Аудио- или видеофайл: MP3, WAV, M4A, AAC, OGG, OPUS, FLAC, MP4, MOV, MKV, AVI, WEBM и другие.
language
в форме
string нет Язык записи. auto — определить автоматически.
значения: auto, ru, en
по умолчанию: auto
group_id
в форме
uuid нет Группа, в которую попадёт запись. Должна принадлежать вашему аккаунту.
denoise_enabled
в форме
boolean нет Шумоподавление перед распознаванием. Игнорируется, если тариф его не включает.
по умолчанию: false
webhook_url
в форме
string нет Адрес для уведомления именно об этой записи. Перебивает адрес по умолчанию с ключа.
Заголовки
  • Idempotency-Key Защита от дублей при повторе запроса. Подробнее — в разделе об идемпотентности.
Ответы
  • 202 Запись создана и поставлена в очередь.
  • 402 Лимит записей или минут тарифа исчерпан. limit_transcriptions
  • 409 Запрос с этим Idempotency-Key ещё выполняется. idempotency_in_flight
  • 422 Файл не прошёл валидацию: формат, размер или неверный webhook_url.
Пример запроса
curl -X POST https://cosmoscribe.ru/api/v1/transcriptions \
  -H "X-API-Key: $COSMIC_API_KEY" \
  -H "Idempotency-Key: order-1042" \
  -F "file=@meeting.mp3" \
  -F "language=auto" \
  -F "webhook_url=https://example.ru/hooks/cosmic"
Пример ответа
{
  "message": "Транскрибация поставлена в очередь",
  "log_id": "9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70",
  "status": "queued"
}
POST /api/v1/transcriptions/url

Импортировать по ссылке

Скачивает запись по ссылке и расшифровывает её.

Российские источники (VK Видео, RuTube, Одноклассники, Дзен, Mail.ru, Telegram, Яндекс.Диск) доступны на всех тарифах; зарубежные (YouTube, Vimeo, Twitch, SoundCloud, Dailymotion, Apple Podcasts и другие) — с тарифа «Профессионал». Прямые ссылки на файл проходят проверку хоста от подмены на внутренний адрес. Скачивание асинхронное: ответ приходит до его окончания.

Параметры
Параметр Тип Обяз. Описание
url
в теле
string да Ссылка на запись или прямая ссылка на файл, до 2048 символов.
language
в теле
string нет Язык записи. Обратите внимание: у импорта по ссылке значение по умолчанию — ru, а не auto.
значения: auto, ru, en
по умолчанию: ru
group_id
в теле
uuid нет Группа для записи.
webhook_url
в теле
string нет Адрес уведомления об этой записи.
Заголовки
  • Idempotency-Key Защита от повторного импорта одной ссылки.
Ответы
  • 202 Скачивание поставлено в очередь.
  • 402 Лимит тарифа исчерпан либо платформа требует тариф выше. forbidden_platform_tier
  • 403 Хост заблокирован или запись закрыта. private_content
  • 413 Запись длиннее или больше лимита тарифа. size_exceeded
  • 415 Платформа не поддерживается. unsupported_platform
  • 422 Ссылка не разобрана, ведёт на прямую трансляцию или не содержит звука. invalid_url
  • 504 Источник не ответил вовремя. timeout
Пример запроса
curl -X POST https://cosmoscribe.ru/api/v1/transcriptions/url \
  -H "X-API-Key: $COSMIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://vk.com/video-1_1","language":"ru"}'
POST /api/v1/transcriptions/url/preview

Проверить ссылку

Возвращает платформу, название и длительность без создания записи.

Полезно, чтобы показать пользователю, что именно будет расшифровано, и заранее убедиться, что ссылка поддерживается. Минуты не списываются.

Параметры
Параметр Тип Обяз. Описание
url
в теле
string да Проверяемая ссылка.
Ответы
  • 200 Поля ok, platform, host, url и meta с заголовком, длительностью и размером записи.
  • 415 Платформа не поддерживается. unsupported_platform
  • 422 Ссылка не разобрана. invalid_url
POST /api/v1/transcriptions/batch

Пакетная загрузка

Ставит в очередь несколько файлов одним запросом.

Количество файлов за раз и суммарный размер ограничены настройками сервиса. Параметр webhook_url этот метод не принимает — уведомления по каждой записи придут на адрес по умолчанию, заданный на ключе.

Параметры
Параметр Тип Обяз. Описание
files[]
в форме
file[] да Массив файлов, минимум один.
language
в форме
string нет Язык для всех файлов пакета.
значения: auto, ru, en
по умолчанию: auto
group_id
в форме
uuid нет Группа для всех записей пакета.
denoise_enabled
в форме
boolean нет Шумоподавление для всех файлов пакета.
по умолчанию: false
Ответы
  • 202 Массив items: имя файла, log_id и статус по каждой записи.
  • 402 Не хватает лимита на весь пакет. limit_transcriptions
  • 422 Превышено число файлов, размер одного файла или суммарный размер.
GET /api/v1/transcriptions/{id}

Статус и результат

Отдаёт статус, текст, сегменты и спикеров.

Один метод на весь жизненный цикл: пока запись не готова, поля с текстом пустые, а status равен queued или processing. К тексту уже применён словарь терминов. Опрашивать метод в цикле не нужно, если настроен вебхук.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи из ответа на создание.
Ответы
  • 200 Объект записи в поле data.
  • 403 Запись принадлежит другому аккаунту.
  • 404 Записи с таким идентификатором нет.
Пример запроса
curl https://cosmoscribe.ru/api/v1/transcriptions/9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70 \
  -H "X-API-Key: $COSMIC_API_KEY"
Пример ответа
{
  "data": {
    "id": "9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70",
    "status": "completed",
    "original_filename": "meeting.mp3",
    "language": "ru",
    "clean_text": "Добрый день. Начнём с плана на квартал…",
    "formatted_text": "[00:00] Спикер 1: Добрый день…",
    "segments": [
      {
        "start": 0.48,
        "end": 4.12,
        "text": "Добрый день. Начнём с плана на квартал.",
        "speaker": "SPEAKER_00",
        "words": [
          { "word": "Добрый", "start": 0.48, "end": 0.91 },
          { "word": "день.", "start": 0.94, "end": 1.32 }
        ]
      }
    ],
    "is_partial": false,
    "audio_duration_seconds": 1847,
    "full_duration_seconds": 1847,
    "group_id": null,
    "source_type": "upload"
  }
}
GET /api/v1/transcriptions/history

Список записей

Постраничный список записей аккаунта с фильтрами.

Параметры
Параметр Тип Обяз. Описание
limit
в строке запроса
integer нет Размер страницы, от 1 до 100.
по умолчанию: 50
page
в строке запроса
integer нет Номер страницы.
по умолчанию: 1
search
в строке запроса
string нет Поиск по названию и тексту, до 200 символов.
group_id
в строке запроса
uuid нет Фильтр по группе. Пустая строка — записи без группы.
date_from
в строке запроса
date нет Начало периода.
date_to
в строке запроса
date нет Конец периода.
date_preset
в строке запроса
string нет Готовый период вместо пары дат.
значения: today, week, month
has_summary
в строке запроса
boolean нет Только записи с готовым кратким содержанием.
Ответы
  • 200 Поля data и meta с current_page, last_page, per_page и total.
GET /api/v1/transcriptions/{id}/export

Экспорт

Отдаёт готовую расшифровку в одном из пяти форматов.

Формат json возвращает JSON с текстом и сегментами, остальные — файл на скачивание. Текстовые форматы отдаются в UTF-8 с BOM, чтобы Windows-редакторы не ломали кириллицу. Если у записи есть пословные тайм-коды, srt и vtt режутся по границам слов: карточка не длиннее 7 секунд и не шире двух строк по 42 символа, разрыв предпочитается на конце предложения. Без пословных данных реплика отдаётся одной карточкой, как раньше. Если у записи распознаны спикеры, srt получает имя в начале карточки при смене говорящего, а vtt — тег <v Имя> в каждой карточке; на записях без спикеров вывод прежний.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
format
в строке запроса
string да Формат выгрузки.
значения: txt, srt, vtt, json, doc
Ответы
  • 200 Файл или JSON в зависимости от формата.
  • 409 Запись ещё не готова. not_completed
Пример запроса
curl -L "https://cosmoscribe.ru/api/v1/transcriptions/9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70/export?format=srt" \
  -H "X-API-Key: $COSMIC_API_KEY" -o meeting.srt
PUT /api/v1/transcriptions/{id}

Правка записи

Меняет название, текст, сегменты или группу.

Правка текста через API — то же действие, что редактирование в интерфейсе: сохранённый текст становится источником для экспорта и поиска.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
title
в теле
string нет Название записи, до 200 символов.
clean_text
в теле
string нет Полный текст расшифровки.
segments
в теле
array нет Массив сегментов. Меняйте вместе с текстом, иначе таймкоды разойдутся.
group_id
в теле
uuid нет Новая группа записи; null — вынести из группы.
Ответы
  • 200 Обновлённая запись.
  • 422 Ошибка валидации.
DELETE /api/v1/transcriptions/{id}

Удалить запись

Удаляет запись вместе с аудиофайлом.

Действие необратимо: удаляются и текст, и файл в хранилище.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
Ответы
  • 200 Запись удалена.
POST /api/v1/transcriptions/{id}/resume

Докрутить остаток

Расшифровывает часть записи, отрезанную по лимиту минут.

Нужен, когда в ответе пришло is_partial = true. Метод дочитывает запись с того места, где остановился прошлый прогон, и склеивает сегменты. Доступен, пока исходный файл не удалён по сроку хранения тарифа.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор усечённой записи.
Ответы
  • 202 Докрутка поставлена в очередь; в ответе planned_to_seconds и new_seconds.
  • 402 Минут на продолжение не хватает. audio_budget_exceeded
  • 410 Исходный файл уже удалён по сроку хранения. audio_unavailable
  • 422 Запись расшифрована полностью.
POST /api/v1/transcriptions/{id}/retry

Повторить обработку

Перезапускает расшифровку записи со статусом failed.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
Ответы
  • 200 Запись поставлена в очередь повторно.
  • 404 Аудиофайл не найден в хранилище.
  • 422 Повтор возможен только для статуса failed.
GET /api/v1/transcriptions/{id}/audio

Аудио записи

Отдаёт исходное аудио потоком.

Файл расшифровывается на лету, поддерживаются частичные запросы по Range для перемотки в плеере.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
Ответы
  • 200 Поток аудио.
  • 404 Файл уже удалён по сроку хранения.
GET /api/v1/transcriptions/{id}/waveform

Пики волны

Готовые пики для отрисовки дорожки без декодирования файла.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
Ответы
  • 200 Массив пиков и длительность.
POST /api/v1/transcriptions/assign

Перенести в группу

Меняет группу у нескольких записей сразу.

Параметры
Параметр Тип Обяз. Описание
ids
в теле
uuid[] да Идентификаторы записей, минимум один.
group_id
в теле
uuid нет Целевая группа; null — вынести из групп.
Ответы
  • 200 Число перенесённых записей.
POST /api/v1/transcriptions/bulk-delete

Массовое удаление

Удаляет до 100 записей за запрос.

Параметры
Параметр Тип Обяз. Описание
ids
в теле
uuid[] да Идентификаторы записей, от 1 до 100.
Ответы
  • 200 Число удалённых записей.
POST /api/v1/transcriptions/bulk-download

Массовая выгрузка

Собирает ZIP-архив с расшифровками выбранных записей.

Параметры
Параметр Тип Обяз. Описание
ids
в теле
uuid[] да Идентификаторы записей, от 1 до 100.
format
в теле
string да Формат файлов внутри архива.
значения: txt, srt, vtt
Ответы
  • 200 Поток ZIP-архива.
POST /api/v1/transcriptions/{id}/share

Публичная ссылка

Создаёт ссылку на расшифровку со сроком жизни и паролем.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
expires_in
в теле
string да Срок жизни ссылки.
значения: 1h, 1d, 1w
password
в теле
string нет Пароль на ссылку, от 4 символов. Доступен на платных тарифах.
Ответы
  • 200 Токен, готовый share_url и дата истечения.
  • 402 Лимит ссылок исчерпан или пароль не входит в тариф. limit_share_links

AI поверх записи

Краткие содержания и перевод. Оба метода асинхронные: создают объект в статусе queued и наполняют его позже.

POST /api/v1/transcriptions/{id}/summaries

Создать краткое содержание

Ставит в очередь пересказ записи по готовому шаблону или по своему промпту.

Запись должна быть готова и содержать не меньше 50 символов текста. По одной записи можно держать несколько шаблонов одновременно. Готовность отслеживается через GET /summaries/{id}: пока модель работает, статус равен queued или processing. Шаблон custom требует поля custom_instruction — текстового описания нужного разбора; формат ответа при этом остаётся тем же, а поле metadata у такого пересказа всегда пустое.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
template
в теле
string да Шаблон под формат записи. Расшифровка шаблонов — в разделе о кратких содержаниях.
значения: general, meeting, interview, lecture, podcast, sales_call, support_call, voice_note, brainstorm, highlights, custom
custom_instruction
в теле
string нет Описание нужного разбора для template=custom: от 10 до 2000 символов. Задаёт, что искать в записи и на чём сделать акцент; схему ответа и запрет на выдумывание фактов не отменяет.
Ответы
  • 202 Объект краткого содержания в статусе queued.
  • 422 Запись не готова, текста мало или шаблон неизвестен.
  • 429 Месячный лимит кратких содержаний исчерпан либо они не входят в тариф — различить можно по тексту message.
Пример запроса
curl -X POST https://cosmoscribe.ru/api/v1/transcriptions/9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70/summaries \
  -H "X-API-Key: $COSMIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"template":"meeting"}'

curl -X POST https://cosmoscribe.ru/api/v1/transcriptions/9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70/summaries \
  -H "X-API-Key: $COSMIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"template":"custom","custom_instruction":"Выпиши все возражения клиента и как на них ответили."}'
GET /api/v1/transcriptions/{id}/summaries

Краткие содержания записи

Все пересказы одной записи со статусами.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
Ответы
  • 200 Массив кратких содержаний.
GET /api/v1/summaries/{id}

Готовое краткое содержание

Текст пересказа, тезисы, задачи и темы.

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

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор краткого содержания.
Ответы
  • 200 Объект краткого содержания.
Пример ответа
{
  "id": "b4c9a1d2-77e3-4f10-8c55-1a2b3c4d5e6f",
  "transcription_log_id": "9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70",
  "template": "meeting",
  "status": "completed",
  "summary_text": "Обсудили план на квартал…",
  "key_points": ["Запуск переносится на март"],
  "action_items": [
    { "task": "Прислать смету", "assignee": "Иван", "due_date": "2026-09-01", "completed": false }
  ],
  "topics": ["Планирование"],
  "language": "ru",
  "generated_at": "2026-08-25T12:44:19+00:00"
}
PUT /api/v1/summaries/{id}

Отметить задачи

Обновляет список задач в готовом кратком содержании.

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

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор краткого содержания.
action_items
в теле
array да Массив объектов с полями task, assignee, due_date и completed.
Ответы
  • 200 Обновлённое краткое содержание.
  • 422 Пересказ не готов или шаблон не поддерживает задачи.
DELETE /api/v1/summaries/{id}

Удалить краткое содержание

Удаляет пересказ, сама запись остаётся.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор краткого содержания.
Ответы
  • 200 Удалено.
POST /api/v1/transcriptions/{id}/translations

Перевести расшифровку

Ставит в очередь перевод текста и сегментов.

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

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
target_language
в теле
string нет Язык перевода.
значения: ru, en, de, fr, es, it, pt, zh, tr, ar, kk, uk
по умолчанию: ru
Ответы
  • 202 Объект перевода в статусе queued. Тот же код вернётся, если перевод на этот язык уже готовится.
  • 422 Запись не готова, текста мало, он длиннее лимита модели или язык записи совпадает с языком перевода.
  • 429 Месячный лимит переводов исчерпан либо перевод не входит в тариф — различить можно по тексту message.
GET /api/v1/transcriptions/{id}/translations

Переводы записи

Все переводы одной записи со статусами.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор записи.
Ответы
  • 200 Массив переводов.
GET /api/v1/translations/{id}

Готовый перевод

Переведённый текст и сегменты.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор перевода.
Ответы
  • 200 Объект перевода.
DELETE /api/v1/translations/{id}

Удалить перевод

Удаляет перевод, сама запись остаётся.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор перевода.
Ответы
  • 200 Удалено.

Словарь терминов

Замены применяются к тексту при выдаче: имена, бренды, аббревиатуры. Требуется тариф со словарём.

GET /api/v1/dictionary

Список замен

Все пары «как распознано» и «как должно быть».

Ответы
  • 200 Массив записей словаря.
  • 402 Словарь не входит в тариф. feature_dictionary_disabled
POST /api/v1/dictionary

Добавить замену

Создаёт или обновляет пару замены.

Если пара с таким from уже есть, обновится только to — повторный вызов безопасен.

Параметры
Параметр Тип Обяз. Описание
from
в теле
string да Как слово распознаётся сейчас, до 500 символов.
to
в теле
string да Как его нужно писать, до 500 символов.
Ответы
  • 201 Созданная или обновлённая запись.
  • 402 Лимит записей словаря исчерпан. limit_dictionary_entries
GET /api/v1/dictionary/export

Выгрузить словарь

Пары from и to в порядке алфавита — готовый бэкап.

Ответы
  • 200 Массив пар.
POST /api/v1/dictionary/import

Загрузить словарь

Массовое добавление до 1000 пар за запрос.

Параметры
Параметр Тип Обяз. Описание
data
в теле
array да Массив объектов с полями from и to, до 1000 элементов.
Ответы
  • 200 Сколько записей добавлено и сколько обновлено.
DELETE /api/v1/dictionary/{id}

Удалить замену

Убирает одну пару из словаря.

Параметры
Параметр Тип Обяз. Описание
id
в пути
integer да Идентификатор записи словаря.
Ответы
  • 204 Удалено, тело ответа пустое.

Группы записей

Папки для записей: передавайте group_id при создании или переносите записи методом assign.

GET /api/v1/groups

Список групп

Группы аккаунта с числом записей.

Ответы
  • 200 Массив групп.
POST /api/v1/groups

Создать группу

Новая папка для записей.

Параметры
Параметр Тип Обяз. Описание
name
в теле
string да Название, до 255 символов.
description
в теле
string нет Описание группы.
color
в теле
string нет Цвет метки в формате #RRGGBB.
по умолчанию: #000000
Ответы
  • 200 Созданная группа.
  • 402 Лимит групп тарифа исчерпан. limit_groups
GET /api/v1/groups/{id}

Группа

Одна группа с её записями.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор группы.
Ответы
  • 200 Объект группы.
PUT /api/v1/groups/{id}

Изменить группу

Меняет название, описание или цвет.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор группы.
name
в теле
string нет Новое название.
description
в теле
string нет Новое описание.
color
в теле
string нет Новый цвет в формате #RRGGBB.
Ответы
  • 200 Обновлённая группа.
DELETE /api/v1/groups/{id}

Удалить группу

Удаляет папку; записи остаются без группы.

Параметры
Параметр Тип Обяз. Описание
id
в пути
uuid да Идентификатор группы.
Ответы
  • 200 Группа удалена.

Ключ и вебхук

Состояние ключа, лимиты тарифа и адрес доставки уведомлений.

GET /api/v1/account

Состояние ключа

Лимиты ключа, секрет вебхука и лимиты тарифа.

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

Ответы
  • 200 Объекты client, webhook и plan.
Пример запроса
curl https://cosmoscribe.ru/api/v1/account -H "X-API-Key: $COSMIC_API_KEY"
Пример ответа
{
  "client": {
    "id": "3f2a1b0c-1111-2222-3333-444455556666",
    "name": "Продакшен",
    "status": "active",
    "rpm_limit": 60,
    "daily_limit": 5000,
    "monthly_limit": 100000
  },
  "webhook": {
    "url": "https://example.ru/hooks/cosmic",
    "secret": "8f14e45fceea167a5a36dedd4bea2543",
    "signature_header": "X-Cosmic-Signature",
    "signature_algo": "hmac-sha256(raw_body, secret), hex"
  },
  "plan": {
    "max_file_mb": 500,
    "monthly_audio_minutes": 1200
  }
}
PUT /api/v1/account/webhook

Адрес и секрет вебхука

Задаёт адрес доставки по умолчанию и ротирует секрет.

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

Параметры
Параметр Тип Обяз. Описание
webhook_url
в теле
string нет Публичный http/https-адрес; пустая строка убирает адрес.
rotate_secret
в теле
boolean нет Сгенерировать новый секрет подписи.
по умолчанию: false
Ответы
  • 200 Актуальные адрес и секрет.
  • 422 Адрес недоступен или указывает на приватный хост. webhook_invalid
Без поллинга

Вебхуки

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

События
  • transcription.completed

    Запись расшифрована. Текст забирается отдельным GET по ссылке из links.result.

  • transcription.failed

    Обработка завершилась ошибкой; причина — в data.error.

  • webhook.test

    Проверочное уведомление, отправленное кнопкой в профиле. Записи за ним нет — отвечайте 2xx и игнорируйте.

Заголовки уведомления
  • X-Cosmic-Event

    Имя события — то же, что в поле event тела.

  • X-Cosmic-Delivery

    UUID доставки. Разный у повторов, годится для дедупликации логов.

  • X-Cosmic-Signature

    hex-строка hmac_sha256(сырое тело, секрет ключа).

Правила доставки
  • Секрет вебхука виден в профиле рядом с ключом и в GET /account; там же он ротируется.
  • Считайте подпись от сырого тела запроса до любого парсинга JSON — пересборка тела даёт другую подпись.
  • Сравнивайте подписи функцией постоянного времени (hash_equals, hmac.compare_digest, crypto.timingSafeEqual).
  • Отвечайте кодом 2xx как можно быстрее. Таймаут ответа — 10 секунд, установка соединения — 5.
  • При не-2xx доставка повторяется до 5 раз с интервалами 1, 5, 15 и 60 минут.
  • Редиректы не выполняются: ответ 3xx считается ошибкой доставки — указывайте конечный URL.
  • Одна запись доставляется один раз: после первого успешного ответа повторов не будет.
  • Пакетная загрузка не принимает webhook_url на запрос — для неё работает адрес по умолчанию, заданный на ключе.
Тело уведомления
{
  "event": "transcription.completed",
  "occurred_at": "2026-08-25T12:41:07+00:00",
  "data": {
    "id": "9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70",
    "status": "completed",
    "language": "ru",
    "original_filename": "meeting.mp3",
    "source_type": "upload",
    "is_partial": false,
    "audio_duration_seconds": 1847,
    "full_duration_seconds": 1847
  },
  "links": {
    "result": "https://cosmoscribe.ru/api/v1/transcriptions/9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70",
    "export": "https://cosmoscribe.ru/api/v1/transcriptions/9f1c2f7e-5a44-4c0e-9b1e-2d3c4b5a6f70/export?format=json"
  }
}

Проверка подписи

Подпись гарантирует, что уведомление отправили мы. Считайте HMAC-SHA256 от сырого тела запроса и сравнивайте с заголовком X-Cosmic-Signature функцией постоянного времени.

PHP
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_COSMIC_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $payload, $secret);

if (!hash_equals($expected, $signature)) {
    http_response_code(403);
    exit;
}

$event = json_decode($payload, true);
// $event['data']['id'] — идентификатор записи
Python
import hashlib
import hmac

from flask import abort, request

@app.post("/hooks/cosmic")
def cosmic_hook():
    payload = request.get_data()
    signature = request.headers.get("X-Cosmic-Signature", "")
    expected = hmac.new(SECRET.encode(), payload, hashlib.sha256).hexdigest()

    if not hmac.compare_digest(expected, signature):
        abort(403)

    event = request.get_json()
    return "", 200
Node.js
import crypto from "node:crypto";

app.post(
  "/hooks/cosmic",
  express.raw({ type: "application/json" }),
  (req, res) => {
    const signature = req.get("X-Cosmic-Signature") ?? "";
    const expected = crypto
      .createHmac("sha256", SECRET)
      .update(req.body)
      .digest("hex");

    if (
      expected.length !== signature.length ||
      !crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))
    ) {
      return res.sendStatus(403);
    }

    const event = JSON.parse(req.body.toString("utf8"));
    res.sendStatus(200);
  }
);

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

Повторы без дублей

Идемпотентность

Сеть рвётся в самый неудачный момент — между отправкой файла и получением ответа. Заголовок Idempotency-Key делает повтор запроса безопасным.

  • Передайте свой уникальный ключ (до 255 символов) в заголовке Idempotency-Key при создании записи или импорте по ссылке. Обычно это идентификатор объекта в вашей системе.
  • Первый запрос обрабатывается как обычно. Повтор с тем же ключом не создаёт вторую запись, а возвращает 202 с log_id первой и полем idempotent_replayed = true.
  • Если первый запрос ещё выполняется, повтор получит 409 с кодом idempotency_in_flight — повторите через несколько секунд.
  • Ключи уникальны в пределах одного API-ключа и живут не менее 48 часов, затем очищаются по расписанию — не рассчитывайте на точный момент истечения.
  • Без этого заголовка повторный запрос создаст вторую запись и спишет минуты второй раз.
bash
curl -X POST https://cosmoscribe.ru/api/v1/transcriptions \
  -H "X-API-Key: $COSMIC_API_KEY" \
  -H "Idempotency-Key: crm-deal-8842" \
  -F "file=@call.mp3"
Что ограничено

Лимиты

Два независимых контура: технические лимиты запросов защищают сервис от всплесков, тарифные лимиты минут списывают оплаченный объём.

Лимиты ключа

Значения по умолчанию для нового ключа. Фактические лимиты вашего ключа возвращает GET /account, а расход виден в профиле рядом с ключом.

Лимит По умолчанию Как считается
Запросов в минуту 60 Скользящее окно 60 секунд на ключ. Текущее значение — в GET /account.
Запросов в сутки 5000 Календарные сутки по UTC: счётчик обнуляется в 00:00 UTC, то есть в 03:00 по Москве.
Запросов в месяц 100000 Календарный месяц по UTC.

Лимиты отдельных методов

Дополняют лимиты ключа: срабатывает тот, который наступит раньше.

Метод Ограничение
Все методы v1 60 запросов в минуту
GET /transcriptions/history 60 запросов в минуту
GET /transcriptions/{id}/audio 60 запросов в минуту
POST /transcriptions/url 10 запросов в минуту и 60 запросов в час
POST /transcriptions/url/preview 30 запросов в минуту
POST /transcriptions/bulk-delete, /bulk-download 10 запросов в минуту
POST /transcriptions/{id}/summaries 5 запросов в минуту
POST /transcriptions/{id}/translations 3 запросов в минуту

Минуты и тариф

  • Технические лимиты запросов и тарифные лимиты минут — разные вещи: первые защищают сервис от всплесков, вторые списывают оплаченный объём.
  • Минуты аудио списываются из лимитов тарифа так же, как при загрузке через сайт: один и тот же счётчик на аккаунт.
  • Запись длиннее остатка минут не отклоняется, а усекается: в ответе придёт is_partial = true, остаток дочитывается методом POST /transcriptions/{id}/resume.
  • Каждый ответ несёт заголовки минутного окна ключа: X-RateLimit-Limit — лимит, X-RateLimit-Remaining — остаток, X-RateLimit-Reset — unix-время конца окна. На 429 добавляется Retry-After в секундах.
Диагностика

Коды ошибок

Обрабатывайте ошибки по HTTP-статусу и полю code — текст message предназначен человеку и может меняться.

Статус code Что случилось Что делать
401 api_key_missing Заголовок с ключом не передан. Добавьте X-API-Key или Authorization: Bearer.
401 api_key_invalid Ключ не найден или отозван. Проверьте ключ; отозванный не восстанавливается — выпустите новый.
403 ip_not_allowed IP запроса вне белого списка ключа. Добавьте адрес или подсеть в список IP ключа в профиле.
403 Запись принадлежит другому аккаунту. Ключ видит только записи своего аккаунта.
404 Объект не найден. Проверьте идентификатор — все они UUID.
402 limit_transcriptions Месячный лимит записей или минут тарифа исчерпан. Купите пакет минут или поднимите тариф; тело ответа содержит человекочитаемую причину.
402 audio_budget_exceeded Докрутка невозможна: остатка минут нет. Пополните минуты и повторите POST /resume.
402 forbidden_platform_tier Платформа импорта недоступна на текущем тарифе. Зарубежные платформы — с тарифа «Профессионал».
402 limit_groups Лимит групп тарифа исчерпан. Удалите ненужную группу или поднимите тариф.
402 limit_dictionary_entries Лимит записей словаря исчерпан. Удалите неактуальные пары или поднимите тариф.
402 limit_share_links Лимит публичных ссылок исчерпан. Удалите старую ссылку или поднимите тариф.
402 feature_dictionary_disabled Словарь не входит в тариф. Словарь доступен с тарифа «Лайт».
409 not_completed Экспорт запрошен до готовности записи. Дождитесь статуса completed — надёжнее по вебхуку.
409 idempotency_in_flight Запрос с этим Idempotency-Key ещё выполняется. Повторите через несколько секунд.
410 audio_unavailable Исходное аудио удалено по сроку хранения тарифа. Загрузите файл заново.
413 size_exceeded Файл по ссылке больше лимита тарифа. Уменьшите файл или поднимите тариф.
415 unsupported_platform Ссылка с неподдерживаемой платформы. Список платформ — в описании метода импорта.
422 Ошибка валидации; поле errors содержит разбор по параметрам. Исправьте параметры запроса.
422 webhook_invalid webhook_url недоступен или указывает на приватный хост. Укажите публичный http/https-адрес без редиректов.
422 webhook_not_allowed webhook_url передан в запросе без API-ключа. Параметр работает только при аутентификации ключом.
429 rate_limit_rpm Превышен лимит запросов ключа в минуту. Дождитесь окна из заголовка Retry-After.
429 rate_limit_daily Превышен дневной лимит запросов ключа. Лимит сбрасывается в 00:00 UTC (03:00 по Москве); точное время ожидания — в заголовке Retry-After.
429 rate_limit_monthly Превышен месячный лимит запросов ключа. Напишите в поддержку, если объём вырос.
429 Сработал общий троттлинг маршрута. Соблюдайте лимиты из раздела о лимитах.
429 Месячный лимит AI-операций тарифа (краткие содержания, перевод) исчерпан либо функция не входит в тариф. Проверьте текст message: он различает эти два случая. Заголовка Retry-After здесь нет — повтор поможет только после смены тарифа или в новом расчётном периоде.
503 disabled Функция временно отключена на стороне сервиса. Повторите позже.

Что повторять, а что нет

  • Повторять с задержкой стоит 429, 502, 503 и 504 — это временные состояния. Начните с интервала из заголовка Retry-After, дальше увеличивайте паузу.
  • Не повторять: 401, 403, 422 — запрос не изменится сам по себе, нужно править ключ или параметры.
  • Ошибку 402 повторяют не сразу, а после пополнения минут или смены тарифа.
  • Любой повтор запроса на создание записи отправляйте с тем же Idempotency-Key, иначе получите дубль и двойное списание минут.
Значения полей

Справочники

Допустимые значения параметров, на которые ссылается справочник методов.

Статусы записи

Значение Описание
queued Принята и ждёт своей очереди.
processing Обрабатывается: подготовка звука, распознавание, разделение по спикерам.
completed Готова: доступны текст, сегменты и экспорт.
failed Обработка не удалась; причина — в поле api_raw.error, запись можно перезапустить методом retry.

Форматы экспорта

Значение Описание
txt Чистый текст, UTF-8 с BOM
srt Субтитры SubRip: нарезка по границам слов, имя спикера при смене говорящего
vtt Субтитры WebVTT: та же нарезка, спикер тегом <v Имя> в каждой карточке
json Текст плюс массив сегментов со start/end, спикерами и пословными тайм-кодами
doc Оформленный документ Word с разделением по спикерам

Шаблоны кратких содержаний

Значение Описание
general Общее краткое содержание
meeting Встреча: решения, задачи, риски
interview Интервью: цитаты, заголовок-кандидат
lecture Лекция: тезисы, термины, примеры
podcast Подкаст: шоуноуты, гости
sales_call Звонок клиенту: возражения, сигналы, договорённости
support_call Звонок в поддержку: проблема, решение, обещания
voice_note Голосовая заметка: идеи, напоминания
brainstorm Мозговой штурм: идеи с плюсами и минусами
highlights Хайлайты: 3–5 цитат с таймкодами
custom Свой промпт: разбор по вашему описанию (нужен custom_instruction)

Языки перевода

ru en de fr es it pt zh tr ar kk uk

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

Где взять API-ключ?
В профиле: «Безопасность» → «API-ключи» → «Выпустить ключ». Раздел доступен на тарифе «Бизнес». Ключ показывается один раз при выпуске, там же настраиваются адрес вебхука и белый список IP.
Как тарифицируются запросы?
Списываются минуты аудио из лимитов тарифа — так же, как при загрузке через сайт. Сами HTTP-запросы не тарифицируются, на них действуют только технические лимиты в минуту, день и месяц.
Сколько ждать результат?
Обработка асинхронная, время зависит от длительности записи и загрузки очереди. Не опрашивайте статус в плотном цикле — настройте вебхук, а поллинг оставьте как запасной вариант с интервалом от 10 секунд.
Почему в ответе пустой текст?
Скорее всего, статус ещё queued или processing: метод отдаёт один и тот же объект на всём жизненном цикле. Текст появится при статусе completed.
Что делать с is_partial = true?
Запись усечена по остатку минут тарифа. Пополните минуты и вызовите POST /transcriptions/{id}/resume — сервис дочитает остаток из уже загруженного файла и склеит сегменты. Пока файл не удалён по сроку хранения тарифа, повторная загрузка не нужна.
Вебхук не приходит — где искать?
Проверьте три вещи: адрес отвечает 2xx на POST от внешнего сервера; на нём нет редиректа (ответ 3xx считается ошибкой доставки); адрес публичный, а не внутренний. Убедиться, какой адрес известен сервису, можно запросом GET /account.
Можно ли обращаться к API из браузера?
Нет. Ключ даёт полный доступ к записям аккаунта, а в браузере его увидит любой пользователь. Вызывайте API со своего сервера, а браузеру отдавайте уже готовый результат.
Есть ли готовые SDK?
Отдельных библиотек мы не выпускаем: спецификация OpenAPI 3.1 позволяет сгенерировать клиент под нужный язык за минуту и импортировать коллекцию в Postman или Insomnia.

Готовы к первому запросу?

Выпустите ключ в профиле — он появится сразу, без заявок и переписки. Вопросы по интеграции и лимитам под ваш объём разберём в поддержке.