API системы анализа звонков позволяет автоматически оценивать качество телефонных разговоров ваших операторов с использованием искусственного интеллекта.
Что делает система?
Транскрибирует аудиозапись разговора в текст с высокой точностью
Определяет была ли успешно оформлена запись пациента на прием
Анализирует диалог по критериям качества обслуживания
Оценивает работу оператора по 10 ключевым показателям эффективности (KPI)
Формирует детальный результат анализа с итоговой оценкой, практическими советами, инсайтами и персональными рекомендациями по улучшению
Генерирует ежедневные, еженедельные и ежемесячные AI-отчеты для операторов и менеджеров с индивидуальным анализом динамики и точками роста
Отправляет обратную связь операторам и руководителям в Telegram с детализацией по каждому звонку
Технические требования
Формат аудио
MP3, WAV, OGG
Качество
рекомендуется 16kHz, mono
Размер файла
до 1 МБ
Длительность
до 10 минут
Быстрый старт
Три простых шага для начала работы с API
Получите доступ
Обратитесь к администратору системы для получения:
- •URL API endpoint
https://app.ai-calls.future-optic.pro/api/analyze - •ID вашей клиники (
clinic_id) - •API токен клиники (
api_token) - для безопасного доступа - •Список ID ваших операторов (
operator_id) - •(Опционально) Response Key (
full_response_key)Soon- для полного ответа с транскриптом и KPI
Укажите время звонка (call_datetime)
Передайте дату/время звонка в параметре call_datetime и укажите его формат через datetime_format. Если не указано — система возьмёт текущее московское время (UTC+3). Подробнее см. раздел Параметры даты и времени.
Сделайте первый запрос
Отправьте тестовый запрос с аудиофайлом:
curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "call_id=test-001" \
-F "clinic_id=1" \
-F "api_token=clinic_token_..." \
-F "operator_id=123" \
-F "audio_url=https://example.com/recording.mp3"Endpoint: POST /analyze
Основной endpoint для отправки звонка на анализ
https://app.ai-calls.future-optic.pro/api/analyzeВсе запросы отправляются методом POST на указанный URL
Content-Type
multipart/form-dataЗапросы должны отправляться с заголовком Content-Type: multipart/form-data, так как API принимает файлы
Поддерживаемые форматы аудио
Все форматы автоматически конвертируются в WAV 16kHz mono перед отправкой в AI
Параметры запроса
Полное описание обязательных и опциональных параметров API
Обязательные параметры
| Параметр | Тип | Описание | Пример |
|---|---|---|---|
| call_id | string | Уникальный ID звонка из вашей системы | "call-2025-123" |
| clinic_id | integer | ID вашей клиники | 1 |
| api_token | string | API токен для аутентификации запроса (получите у администратора) | "clinic_token_..." |
| file ИЛИ audio_url | file/string | Аудиофайл или URL записи | См. примеры |
file (загрузка файла), либо audio_url (ссылка), но не оба параметра одновременно.Опциональные параметры
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| operator_id | string | - | ID оператора в вашей системе (строка до 50 символов, допустимы цифры и буквы). Если не указан — анализ выполняется, но не сохраняется (skip_db_save). Если указан неверно — ответ 404 и анализ не выполняется. |
| call_datetime | string | Московское время (UTC+3) | Дата и время звонка. Поддерживается 8 форматов (см. детали ниже) |
| datetime_format | string | iso8601 | Формат даты из call_datetime. Доступные: iso8601,ru_datetime,sql_datetime,unix_timestamp и др. |
| timezone | string | Europe/Moscow | Timezone для форматов без встроенного timezone. Поддерживаются: IANA (Europe/Moscow), сокращения (MSK, EST, PST), UTC offset (UTC+3) |
| provider | string | AI провайдер: openai или google | |
| model | string | normal | Модель (только OpenAI): normal или mini |
| trim_start_seconds | float | 0 | Обрезать начало записи (0-300 секунд) |
full_response_key Soon | string | - | Ключ для получения полного ответа (транскрипт + KPI + инсайты). Без ключа возвращается только: call_id, clinic_id, operator_id, operator_id_custom, call_datetime, skip_db_save, final_score |
Параметры даты и времени
API поддерживает 8 форматов даты/времени для удобства интеграции с различными CRM-системами.
| Формат | Параметр | Пример | Использование |
|---|---|---|---|
| ISO 8601 | iso8601 | 2025-10-21T14:30:00+03:00 | Международный стандарт (по умолчанию) |
| Российский | ru_datetime | 21.10.2025 14:30:00 | 1C, российские CRM |
| Европейский | eu_datetime | 21/10/2025 14:30:00 | Европейские системы |
| Американский | us_datetime | 10/21/2025 02:30:00 PM | Американские CRM |
| SQL | sql_datetime | 2025-10-21 14:30:00 | Битрикс24, SQL базы |
| Компактный | compact | 20251021143000 | Legacy системы |
| Unix timestamp | unix_timestamp | 1729512600 | amoCRM, API |
| Unix timestamp ms | unix_timestamp_ms | 1729512600000 | JavaScript Date.now() |
Параметр: timezone
Используется для форматов без встроенного timezone (ru_datetime, eu_datetime, us_datetime, sql_datetime, compact).
IANA timezone
- →
Europe/Moscow - →
America/New_York - →
Asia/Tokyo
Сокращения
- →
MSK(Москва) - →
EST,PST(США) - →
CET(Европа)
UTC offset
- →
UTC+3 - →
UTC-5 - →
+03:00
Обратная совместимость: Все старые запросы с ISO 8601 работают без изменений.
Примеры использования
curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "call_id=test-001" \
-F "clinic_id=1" \
-F "api_token=clinic_token_..." \
-F "operator_id=123" \
-F "call_datetime=21.10.2025 14:30" \
-F "datetime_format=ru_datetime" \
-F "timezone=MSK" \
-F "audio_url=https://example.com/recording.mp3"curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "call_id=test-002" \
-F "clinic_id=1" \
-F "api_token=clinic_token_..." \
-F "operator_id=456" \
-F "call_datetime=1729512600" \
-F "datetime_format=unix_timestamp" \
-F "audio_url=https://example.com/recording.mp3"Параметр: operator_id
Строковый ID оператора в рамках вашей клиники (до 50 символов; можно использовать ваши внутренние идентификаторы, например 123, op-001 или valeria_dzz).
Если указан → система сохраняет результат анализа в базу данных
Если НЕ указан → анализ выполняется, но не сохраняется (возвращается warning)
Пример использования без operator_id:
- •Тестирование системы
- •Анализ звонков, где оператор неизвестен
- •Экспериментальная оценка без сохранения
Параметр: full_response_key (Двухуровневая аутентификация)Soon
full_response_key — секретный ключ для получения полного ответа API с подробным анализом.
Без full_response_key (по умолчанию):
- →Возвращается только
final_scoreи базовые поля - →НЕТ транскрипта, KPI scores, insights, summary
С валидным full_response_key:
- ✓Полная транскрипция разговора
- ✓Детальные KPI scores (10 критериев)
- ✓Инсайты (strengths, areas_for_improvement, strategic_recommendations)
- ✓Информация о затратах и времени обработки
Типы ключей:
- 1Встроенный ключ клиники (
api_response_key)Каждая клиника имеет собственный ключ (доступен администратору)
- 2Глобальные ключи — работают для всех клиник
Создаются суперадмином в настройках (Настройки → API Keys)
- 3Специфичные ключи — работают только для конкретной клиники
Создаются суперадмином для отдельных клиник
Примеры запросов
Готовые примеры для разных сценариев использования API
Пример 1: Загрузка аудиофайла
Отправка локального аудиофайла:
curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "call_id=call-2025-10-21-001" \
-F "clinic_id=1" \
-F "api_token=clinic_token_..." \
-F "operator_id=123" \
-F "full_response_key=clinic_resp_..." \
-F "file=@/path/to/recording.mp3" \
-F "call_datetime=2025-10-21T14:30:00+03:00" \
-F "datetime_format=iso8601"Пример 2: Передача URL записи
Отправка ссылки на аудиофайл вместо загрузки:
curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "call_id=call-2025-10-21-002" \
-F "clinic_id=1" \
-F "api_token=clinic_token_..." \
-F "operator_id=456" \
-F "full_response_key=clinic_resp_..." \
-F "audio_url=https://your-crm.com/recordings/call123.mp3" \
-F "call_datetime=2025-10-21 14:30:00" \
-F "datetime_format=sql_datetime" \
-F "timezone=Europe/Moscow"Пример 3: Анализ без сохранения (тест)
Анализ звонка без указания operator_id — результат НЕ сохраняется в базу данных:
curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "call_id=test-001" \
-F "clinic_id=1" \
-F "api_token=clinic_token_..." \
-F "audio_url=https://example.com/test.mp3" \
-F "call_datetime=21.10.2025 14:30" \
-F "datetime_format=ru_datetime" \
-F "timezone=MSK"Ответ будет содержать:
{
"warning": "Call analyzed successfully but NOT saved to database (operator_id is NULL)",
"skip_db_save": true,
...
}Пример 4: С обрезкой начала записи
Обрезка первых 5 секунд записи (например, для удаления музыки ожидания):
curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "call_id=call-2025-10-21-003" \
-F "clinic_id=1" \
-F "api_token=clinic_token_..." \
-F "operator_id=789" \
-F "full_response_key=clinic_resp_..." \
-F "file=@/path/to/recording.mp3" \
-F "trim_start_seconds=5.0" \
-F "call_datetime=1761046245" \
-F "datetime_format=unix_timestamp" \
-F "timezone=UTC+3"Пример 5: Запрос с полным ответом (full_response_key)Soon
Обратите внимание на параметр full_response_key — он позволяет получить полный анализ:
curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "call_id=call-2025-10-21-001" \
-F "clinic_id=1" \
-F "api_token=clinic_token_..." \
-F "operator_id=123" \
-F "full_response_key=clinic_resp_..." \
-F "file=@/path/to/recording.mp3" \
-F "call_datetime=2025-10-21T14:30:00+03:00" \
-F "datetime_format=iso8601"Разница в ответе:
❌ Без full_response_key
- • call_id, clinic_id
- • operator_id, operator_id_custom
- • final_score
- • call_datetime, skip_db_save
- • transcript (полный текст)
- • kpi_scores (10 критериев)
- • insights (рекомендации)
- • flags (appointment_made, target_call)
- • _processing (время, стоимость)
Формат ответа
API возвращает минимальный или полный ответ в зависимости от наличия full_response_key
Минимальный ответ (200 OK) - По умолчанию
Без параметра full_response_key API возвращает только базовую информацию:
{
"call_id": "call-2025-10-21-001",
"clinic_id": 1,
"operator_id": "f8b58d08-1733-4508-8146-51abd2a9fb4b",
"operator_id_custom": 123,
"call_datetime": "2025-10-21T14:30:00+03:00",
"skip_db_save": false,
"final_score": 87
}Полный ответ (200 OK) - С full_response_key
При передаче валидного full_response_key API возвращает полный анализ:
{
"call_id": "call-2025-10-21-001",
"clinic_id": 1,
"operator_id": "f8b58d08-1733-4508-8146-51abd2a9fb4b",
"operator_id_custom": 123,
"call_datetime": "2025-10-21T14:30:00+03:00",
"skip_db_save": false,
"transcript": "Здравствуйте, клиника Здоровье, меня зовут Анна, чем могу помочь? - Добрый день, я хотел бы записаться на прием к терапевту...",
"final_score": 87,
"summary": "Звонок от потенциального клиента с запросом на запись к терапевту. Оператор Анна вежливо поприветствовала клиента, представилась по имени, уточнила детали и успешно записала на прием. Проинформировала об акции для новых клиентов.",
"kpi_scores": {
"greeting": {
"score": 10,
"comment": "Отлично: оператор поздоровался, представился и назвал клинику"
},
"politeness": {
"score": 9,
"comment": "Использовал вежливые обращения на протяжении всего разговора"
},
"active_listening": {
"score": 8,
"comment": "Внимательно слушал клиента, уточнял детали"
},
"product_knowledge": {
"score": 9,
"comment": "Знает цены и расписание врачей"
},
"objection_handling": {
"score": 7,
"comment": "Корректно ответил на вопрос о цене"
},
"appointment_booking": {
"score": 10,
"comment": "Успешно записал клиента, подтвердил дату и время"
},
"promo_communication": {
"score": 9,
"comment": "Проинформировал о скидке 20% для новых клиентов"
},
"call_structure": {
"score": 8,
"comment": "Структурированный разговор с четкими этапами"
},
"closing": {
"score": 8,
"comment": "Правильно завершил разговор, пожелал доброго дня"
}
},
"insights": {
"strengths": [
"Вежливое и профессиональное общение",
"Представление по имени и названию клиники",
"Проактивное информирование об акциях",
"Успешная запись на прием"
],
"areas_for_improvement": [
"Можно более активно работать с возражениями по цене",
"Уточнить был ли клиент у нас ранее для применения акции"
],
"strategic_recommendations": [
"Добавить в скрипт вопрос о предыдущих визитах",
"Обучить технике аргументации ценности услуг"
]
},
"flags": {
"appointment_made": true,
"target_call": true
},
"_processing": {
"transcription_model": "gpt-4o-transcribe",
"analysis_model": "gpt-5",
"cost_usd": 0.05,
"transcript_duration": 180,
"timings_ms": {
"transcription": 5000,
"analysis": 7500
}
}
}Описание полей ответа
| Поле | Описание |
|---|---|
| transcript | Полная текстовая транскрипция разговора |
| final_score | Итоговая оценка качества звонка (0-100) |
| summary | Краткое описание разговора |
| kpi_scores | Оценки по 10 критериям (каждый 1-10) с комментариями |
| insights.strengths | Что оператор сделал хорошо |
| insights.areas_for_improvement | Что можно улучшить |
| insights.strategic_recommendations | Рекомендации для обучения |
| flags.appointment_made | Была ли запись на прием (true/false) |
| flags.target_call | Был ли звонок целевым (true/false) |
Коды ошибок
HTTP коды состояния и примеры ошибок
Таблица HTTP кодов
| HTTP Код | Описание | Решение |
|---|---|---|
200 | Успешно | - |
202 | Обрабатывается (Accepted) | Звонок с таким audio_url уже в процессе обработки. Повторите запрос через указанное время |
400 | Неверные параметры запроса | Проверьте обязательные поля и их формат |
401 | Ошибка аутентификации | Неверный api_token для указанной клиники |
404 | Оператор не найден | Проверьте правильность clinic_id и operator_id |
422 | Неподдерживаемый формат аудио | Используйте MP3, WAV или OGG |
500 | Внутренняя ошибка системы | Обратитесь в поддержку |
503 | Сервис временно недоступен | Повторите запрос через несколько секунд |
Примеры ошибок
Звонок уже обрабатывается (202):
{
"status": "processing",
"message": "Call is currently being processed",
"call_id": "call-2025-123",
"retry_after_seconds": 10,
"processing_age_minutes": 1.5
}Неверный api_token:
{
"error": "Invalid API token for clinic_id=1"
}Отсутствует clinic_id:
{
"error": "Missing clinic_id parameter"
}Неверный формат clinic_id:
{
"error": "clinic_id must be a numeric value"
}Оператор не найден:
{
"error": "Operator not found: clinic_id=1, operator_id=999"
}Оператор указан неверно (анализ не выполняется):
{
"error": "Operator not found: clinic_id=1, operator_id=nonexistent-operator"
}Неподдерживаемый формат:
{
"error": "Unsupported audio format: .m4a"
}Файл и URL одновременно:
{
"error": "Provide either file or audio_url, not both"
}Сценарии интеграции
Выберите подходящий сценарий интеграции для вашей CRM системы
Сценарий 1: Синхронная интеграция
Отправка звонка сразу после завершения
Подходит для:
- Малого количества звонков (до 50 в день)
- Реального времени оценки
- Простой интеграции
Как работает:
- 1Звонок завершился в вашей CRM
- 2CRM отправляет аудио на анализ
- 3Ожидание результата (10-30 секунд)
- 4Сохранение результата в CRM
Сценарий 2: Асинхронная интеграция (очередь)
Отправка звонков в фоновом режиме через очередь
Подходит для:
- Большого количества звонков (50+ в день)
- Пакетной обработки
- Минимизации задержек
Как работает:
- 1Звонок завершился → добавлен в очередь
- 2Фоновый процесс обрабатывает очередь
- 3Результаты сохраняются по мере готовности
Сценарий 3: Webhook интеграция
CRM отправляет webhook при завершении звонка
Подходит для:
- Современных CRM с webhook'ами
- Автоматизации без кода
- Масштабируемости
Как работает:
- 1CRM отправляет webhook на ваш сервер
- 2Ваш сервер принимает данные и отправляет на анализ
- 3Результаты возвращаются в CRM
Сценарий 4: Пакетная обработка
Ежедневная обработка всех звонков за день
Подходит для:
- Аналитики и отчетности
- Экономии ресурсов
- Обработки архива звонков
Как работает:
- 1Каждую ночь скрипт получает список звонков за день
- 2Отправляет все звонки на анализ
- 3Формирует общий отчет
Рекомендации (Best Practices)
Практические советы для эффективной работы с API
Retry логика при дубликатах
API автоматически проверяет дубликаты по audio_url.
Сценарии:
- ✓Звонок уже обработан → возвращает готовый результат (HTTP 200, status: "duplicate")
- ⏳Звонок в процессе обработки (<5 минут) → HTTP 202, retry_after_seconds: 10
- ↻Звонок завис (>5 минут в статусе "processing") → начинает обработку заново
# Первый запрос - звонок уже обрабатывается
curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "audio_url=https://example.com/call.mp3" \
...
# Ответ 202:
{
"status": "processing",
"retry_after_seconds": 10,
"processing_age_minutes": 1.2
}
# Повторный запрос через 10 секунд - обработка завершена
curl -X POST https://app.ai-calls.future-optic.pro/api/analyze \
-F "audio_url=https://example.com/call.mp3" \
...
# Ответ 200:
{
"status": "duplicate",
"message": "Call already processed",
"final_score": 8.5,
"transcript": "..."
}Рекомендации по Timeout
Время обработки зависит от длительности записи и выбранной AI модели (OpenAI/Google).
# Одиночный звонок (1-5 звонков)
timeout: 60 секунд
# Малая партия (6-20 звонков)
timeout: 120 секунд (2 минуты)
# Средняя партия (21-50 звонков)
timeout: 180 секунд (3 минуты)
# Большая партия (50+ звонков)
Используйте асинхронную очередь (Celery) вместо прямых запросовRate Limiting и параллельные запросы
Сервер может обрабатывать до 20 одновременных запросов (количество Gunicorn workers).
Что происходит при превышении лимита:
- →21-й запрос встаёт в очередь и ждёт освобождения воркера
- →Максимальное время ожидания: 180 секунд (timeout)
- →После timeout → HTTP 504 Gateway Timeout
# Текущие лимиты сервера:
- 20 одновременных запросов (Gunicorn workers)
- При превышении: 21-й запрос ждёт освобождения воркера
# Рекомендации:
1. Не отправляйте > 20 запросов параллельно
2. Используйте задержки между запросами (1-2 сек)
3. Для больших объёмов - batch endpoint или async queueBatch обработка (пакетная отправка)
/api/analyze с задержками 1-2 секунды между ними.Что будет доступно (планируемые сценарии использования):
- •Обработка 50+ звонков за один запрос
- •Ночная обработка архива звонков
- •Формирование ежедневных отчётов по всем звонкам за день
Планируемые преимущества batch endpoint:
- ✓1 HTTP-соединение вместо 50 отдельных запросов
- ✓1 транзакция в БД (bulk insert) — быстрее и эффективнее
- ✓Упрощённая обработка ошибок (частичный успех: 45 из 50 обработано)
- ✓Увеличенный timeout (3-5 минут вместо 180 секунд)
Текущее решение (без batch):
Используйте цикл с задержками для массовой обработки:
- →Отправляйте запросы индивидуально через
POST /api/analyze - →Добавляйте задержку 1-2 секунды между запросами
- →Максимум 20 параллельных запросов (лимит Gunicorn workers)
Health Check Endpoint
Публичный endpoint для мониторинга работоспособности системы
Назначение
Health Check endpoint используется системами мониторинга, load balancers и DevOps инструментами для проверки доступности и работоспособности приложения.
Endpoint
/api/healthzURL: https://app.ai-calls.future-optic.pro/api/healthz
Особенности:
Не требует авторизации — доступен публично для мониторинга
Быстрый ответ — timeout ~5 секунд
Проверяет критичные компоненты — база данных, приложение
Формат ответа
Успешный ответ (200 OK):
{
"status": "healthy",
"timestamp": "2025-10-31T09:32:49.439Z",
"checks": {
"database": {
"status": "ok",
"latency_ms": 1088
},
"application": {
"status": "ok",
"uptime_ms": 13249.027193
}
},
"latency_ms": 1093,
"version": "0.1.0"
}Описание полей:
| Поле | Тип | Описание |
|---|---|---|
| status | string | Общий статус: healthy или unhealthy |
| timestamp | string | Временная метка проверки (ISO 8601, UTC) |
| checks.database.status | string | Статус БД: ok или error |
| checks.database.latency_ms | number | Время ответа БД в миллисекундах |
| checks.application.uptime_ms | number | Время работы процесса в миллисекундах |
| latency_ms | number | Общее время выполнения проверки |
| version | string | Версия приложения |
HTTP коды ответа
| Код | Описание |
|---|---|
200 | Система работает нормально, все проверки пройдены |
503 | Система недоступна или не работает корректно |
Примеры использования
cURL:
curl https://app.ai-calls.future-optic.pro/api/healthzPython:
import requests
response = requests.get('https://app.ai-calls.future-optic.pro/api/healthz')
if response.status_code == 200:
data = response.json()
print(f"System is {data['status']}")
print(f"Database latency: {data['checks']['database']['latency_ms']}ms")
else:
print("System is unhealthy!")- Частота проверок: 1-5 минут для production
- Alert если status = "unhealthy"
- Warning если latency_ms > 3000ms