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

API системы анализа звонков позволяет автоматически оценивать качество телефонных разговоров ваших операторов с использованием искусственного интеллекта.

Что делает система?

Транскрибирует аудиозапись разговора в текст с высокой точностью

Определяет была ли успешно оформлена запись пациента на прием

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

Оценивает работу оператора по 10 ключевым показателям эффективности (KPI)

Формирует детальный результат анализа с итоговой оценкой, практическими советами, инсайтами и персональными рекомендациями по улучшению

Генерирует ежедневные, еженедельные и ежемесячные AI-отчеты для операторов и менеджеров с индивидуальным анализом динамики и точками роста

Отправляет обратную связь операторам и руководителям в Telegram с детализацией по каждому звонку

Технические требования

Формат аудио

MP3, WAV, OGG

Качество

рекомендуется 16kHz, mono

Размер файла

до 1 МБ

Длительность

до 10 минут

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

Три простых шага для начала работы с API

1

Получите доступ

Обратитесь к администратору системы для получения:

  • URL API endpointhttps://app.ai-calls.future-optic.pro/api/analyze
  • ID вашей клиники (clinic_id)
  • API токен клиники (api_token) - для безопасного доступа
  • Список ID ваших операторов (operator_id)
  • (Опционально) Response Key (full_response_key)
    Soon
    - для полного ответа с транскриптом и KPI
2

Укажите время звонка (call_datetime)

Передайте дату/время звонка в параметре call_datetime и укажите его формат через datetime_format. Если не указано — система возьмёт текущее московское время (UTC+3). Подробнее см. раздел Параметры даты и времени.

3

Сделайте первый запрос

Отправьте тестовый запрос с аудиофайлом:

Базовый пример
bash
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 для отправки звонка на анализ

POST
https://app.ai-calls.future-optic.pro/api/analyze

Все запросы отправляются методом POST на указанный URL

Content-Type

text
multipart/form-data

Запросы должны отправляться с заголовком Content-Type: multipart/form-data, так как API принимает файлы

Поддерживаемые форматы аудио

.mp3
.wav
.ogg

Все форматы автоматически конвертируются в 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 записиСм. примеры

Опциональные параметры

ПараметрТипПо умолчаниюОписание
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/MoscowTimezone для форматов без встроенного timezone. Поддерживаются: IANA (Europe/Moscow), сокращения (MSK, EST, PST), UTC offset (UTC+3)
provider
string
googleAI провайдер: 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 8601iso86012025-10-21T14:30:00+03:00Международный стандарт (по умолчанию)
Российскийru_datetime21.10.2025 14:30:001C, российские CRM
Европейскийeu_datetime21/10/2025 14:30:00Европейские системы
Американскийus_datetime10/21/2025 02:30:00 PMАмериканские CRM
SQLsql_datetime2025-10-21 14:30:00Битрикс24, SQL базы
Компактныйcompact20251021143000Legacy системы
Unix timestampunix_timestamp1729512600amoCRM, API
Unix timestamp msunix_timestamp_ms1729512600000JavaScript 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

Примеры использования

Российский формат (ru_datetime + timezone)
bash
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"
Unix timestamp (unix_timestamp)
bash
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: Загрузка аудиофайла

Отправка локального аудиофайла:

Загрузка файла с сервера
bash
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 записи

Отправка ссылки на аудиофайл вместо загрузки:

Отправка URL аудиозаписи
bash
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 — результат НЕ сохраняется в базу данных:

Тестовый запрос без operator_id
bash
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"

Ответ будет содержать:

json
{
  "warning": "Call analyzed successfully but NOT saved to database (operator_id is NULL)",
  "skip_db_save": true,
  ...
}

Пример 4: С обрезкой начала записи

Обрезка первых 5 секунд записи (например, для удаления музыки ожидания):

Обрезка начала аудио
bash
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 — он позволяет получить полный анализ:

Запрос с response_key
bash
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
✓ С full_response_key
Soon
  • • transcript (полный текст)
  • • kpi_scores (10 критериев)
  • • insights (рекомендации)
  • • flags (appointment_made, target_call)
  • • _processing (время, стоимость)

Формат ответа

API возвращает минимальный или полный ответ в зависимости от наличия full_response_key

Минимальный ответ (200 OK) - По умолчанию

Без параметра full_response_key API возвращает только базовую информацию:

Ответ без response_key
json
{
  "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 возвращает полный анализ:

Ответ с response_key
json
{
  "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):

json
{
  "status": "processing",
  "message": "Call is currently being processed",
  "call_id": "call-2025-123",
  "retry_after_seconds": 10,
  "processing_age_minutes": 1.5
}

Неверный api_token:

json
{
  "error": "Invalid API token for clinic_id=1"
}

Отсутствует clinic_id:

json
{
  "error": "Missing clinic_id parameter"
}

Неверный формат clinic_id:

json
{
  "error": "clinic_id must be a numeric value"
}

Оператор не найден:

json
{
  "error": "Operator not found: clinic_id=1, operator_id=999"
}

Оператор указан неверно (анализ не выполняется):

json
{
  "error": "Operator not found: clinic_id=1, operator_id=nonexistent-operator"
}

Неподдерживаемый формат:

json
{
  "error": "Unsupported audio format: .m4a"
}

Файл и URL одновременно:

json
{
  "error": "Provide either file or audio_url, not both"
}

Сценарии интеграции

Выберите подходящий сценарий интеграции для вашей CRM системы

Сценарий 1: Синхронная интеграция

Отправка звонка сразу после завершения

Подходит для:

  • Малого количества звонков (до 50 в день)
  • Реального времени оценки
  • Простой интеграции

Как работает:

  1. 1
    Звонок завершился в вашей CRM
  2. 2
    CRM отправляет аудио на анализ
  3. 3
    Ожидание результата (10-30 секунд)
  4. 4
    Сохранение результата в CRM

Сценарий 2: Асинхронная интеграция (очередь)

Soon

Отправка звонков в фоновом режиме через очередь

Подходит для:

  • Большого количества звонков (50+ в день)
  • Пакетной обработки
  • Минимизации задержек

Как работает:

  1. 1
    Звонок завершился → добавлен в очередь
  2. 2
    Фоновый процесс обрабатывает очередь
  3. 3
    Результаты сохраняются по мере готовности

Сценарий 3: Webhook интеграция

Soon

CRM отправляет webhook при завершении звонка

Подходит для:

  • Современных CRM с webhook'ами
  • Автоматизации без кода
  • Масштабируемости

Как работает:

  1. 1
    CRM отправляет webhook на ваш сервер
  2. 2
    Ваш сервер принимает данные и отправляет на анализ
  3. 3
    Результаты возвращаются в CRM

Сценарий 4: Пакетная обработка

Soon

Ежедневная обработка всех звонков за день

Подходит для:

  • Аналитики и отчетности
  • Экономии ресурсов
  • Обработки архива звонков

Как работает:

  1. 1
    Каждую ночь скрипт получает список звонков за день
  2. 2
    Отправляет все звонки на анализ
  3. 3
    Формирует общий отчет

Рекомендации (Best Practices)

Практические советы для эффективной работы с API

Retry логика при дубликатах

API автоматически проверяет дубликаты по audio_url.

Сценарии:

  • Звонок уже обработан → возвращает готовый результат (HTTP 200, status: "duplicate")
  • Звонок в процессе обработки (<5 минут) → HTTP 202, retry_after_seconds: 10
  • Звонок завис (>5 минут в статусе "processing") → начинает обработку заново
Пример retry при дубликате
bash
# Первый запрос - звонок уже обрабатывается
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).

Рекомендуемые timeout для разных объёмов
text
# Одиночный звонок (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
Rate Limiting
text
# Текущие лимиты сервера:
- 20 одновременных запросов (Gunicorn workers)
- При превышении: 21-й запрос ждёт освобождения воркера

# Рекомендации:
1. Не отправляйте > 20 запросов параллельно
2. Используйте задержки между запросами (1-2 сек)
3. Для больших объёмов - batch endpoint или async queue

Batch обработка (пакетная отправка)

Soon

Что будет доступно (планируемые сценарии использования):

  • Обработка 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

GET
/api/healthz

URL: https://app.ai-calls.future-optic.pro/api/healthz

Особенности:

Не требует авторизации — доступен публично для мониторинга

Быстрый ответ — timeout ~5 секунд

Проверяет критичные компоненты — база данных, приложение

Формат ответа

Успешный ответ (200 OK):

Пример ответа
json
{
  "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:

Простая проверка
bash
curl https://app.ai-calls.future-optic.pro/api/healthz

Python:

Python пример
python
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!")