Skip to main content

Обращение к API

Как обращаться к API

  • Базовый адрес: https://{{HUBTALK_FQDN}} — все пути ниже начинаются с /v1. Вместо {{HUBTALK_FQDN}} подставьте адрес, на котором работает ваш кабинет: app.hubtalk.kz — Казахстан, app.hubtalk.uz — Узбекистан.
  • Формат: JSON в запросе и в ответе. Время — секунды эпохи.
  • Машиночитаемая схема: GET https://{{HUBTALK_FQDN}}/openapi.json, интерактивный обозреватель — https://{{HUBTALK_FQDN}}/docs. Схема авторитетна для запросов; успешные ответы опубликованы там нетипизированными объектами, поэтому контракт ответов — таблицы на этой странице.

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

Каждый запрос /v1 несёт ключ:
Секрет (cfk_ + hex) выпускается в кабинете и показывается один раз (Ключ доступа); платформа хранит только SHA-256-хеш. Отозванный ключ перестаёт работать сразу — запись ключа перечитывается на каждом запросе. Ключ ограничен организацией, в которой выпущен: всё, что за этой границей, неотличимо от отсутствующего (404), а не 403. Ни один эндпоинт этого справочника не требует привилегированного ключа. Лимит на ключ. У каждого ключа скользящее окно 60 секунд по всем его запросам /v1. Лимит задаётся ключу при создании и может быть изменён позже в кабинете без ротации секрета (действует со следующего запроса). Лимит 0 означает общий лимит платформы — это настройка развёртывания, 60 запросов в минуту, если оператор не поменял; оператор может и отключить лимит. Это один из четырёх источников 429.

Один конверт ошибки

Все ошибки /v1 выглядят одинаково:
error.code называет точную причину внутри типа и присутствует всегда: если более конкретная причина не зарегистрирована, code равен type. Новые коды со временем добавляются — незнакомый код разбирайте по type + status. Два дополнительных поля приходят только на конкретных отказах по кампаниям и больше нигде: error.blockers на 409 launch_blocked и error.import на 422 calls_rejected / 422 calls_dnc_matched. Любая другая ошибка несёт ровно четыре поля выше.
Класс ошибки определяйте по error.type + error.status, точную причину — по error.code. Никогда не разбирайте error.message — это человекочитаемое английское пояснение, подбираемое по коду на границе API, и частью контракта оно не является. На ошибках схемы 422 (code: "invalid_request") messageмассив замечаний по полям в форме FastAPI/pydantic ({"type", "loc", "msg", "input"}), а не строка.
Отказы проносят свои заголовки через конверт: Retry-After на 429 приходит всегда.

Лимиты и 429

429 приходит из четырёх независимых источников. Все несут error.type: "rate_limit_error" — различайте по error.code: Лимиты группы по умолчанию — 10 одновременных звонков и 30 инициаций в минуту, если администратор не задал другие; для транка, используемого по гранту, действует меньшее из лимита группы и лимита гранта.

Карта запросов

Кампании Загрузки номеров Линии Отдельные звонки