Поиск проблем¶
401 Unauthorized на любой запрос¶
Симптом: на /api/v1/verifications/ приходит {"detail": "Invalid token."}.
Проверьте:
- Заголовок:
Authorization: Bearer tn_live_<prefix>_<secret>(с пробелом послеBearer, без кавычек вокруг токена). - Токен полный — все три части (
tn_live_, prefix 8 символов, секрет). Часто при копировании из дашборда теряется хвост. - Ключ не отозван в дашборде → Keys.
- Окружение токена соответствует окружению API (сейчас все ключи
tn_live_*для продаapp.truenum.ru).
400 {"phone": ["Invalid phone number"]}¶
Симптом: при POST /verifications/ валидация падает на phone.
Проверьте:
- Формат E.164:
+<country_code><number>, только цифры после+, без пробелов / дефисов / скобок. - Длина: от 8 до 15 цифр (плюс ведущий
+). - Реальный код страны и валидная структура номера.
Примеры:
| Неверно | Верно |
|---|---|
8 999 123-45-67 |
+79991234567 |
+7 (999) 123-45-67 |
+79991234567 |
9991234567 |
+79991234567 (нет кода страны) |
+0123 |
(слишком короткий) |
Сообщение об ошибке нормализованное — мы не раскрываем, что именно не понравилось парсеру, чтобы атакующий не мог энумерировать формат.
400 {"webhook_url": [...]}¶
Возможные сообщения:
"Enter a valid URL."— невалидный URL (пропущен scheme, плохой синтаксис)."URL host is not allowed (private/loopback/link-local)."— хост резолвится в приватный диапазон. Используйте публично доступный URL."URL scheme must be http or https."— неподдерживаемая схема."URL too long."— длина >500 символов.
Для локальной разработки используйте ngrok или cloudflared для
проброса наружу.
429 Too Many Requests¶
Симптом: {"detail": "Request was throttled. Expected available in
N seconds."} + заголовок Retry-After: N.
Что делать:
- Дождитесь
Nсекунд, повторите. - Внедрите client-side token bucket: 120 токенов, пополнение 2/сек.
- Если упираетесь регулярно — пишите в саппорт за увеличением лимита.
См. Лимиты.
503 no_dial_number_available¶
Симптом: {"error": "no_dial_number_available", "retry_after": 60}.
Причина: все наши DID заняты другими активными верификациями. У каждого DID одновременно может быть только одна активная верификация до её завершения или истечения TTL.
Что делать:
- Подождите
retry_afterсекунд (обычно 60). - Повторите с экспоненциальным backoff: 60 → 120 → 240 секунд.
- Максимум 3 попытки. После — сообщите пользователю «временные технические проблемы, попробуйте через 5 минут».
- Если стабильно упираетесь — масштабирование DID-пула. Напишите в саппорт.
Webhook не приходит¶
Чек-лист:
- Дашборд → Webhooks → Deliveries → ваша верификация:
- HTTP-код от вашего эндпоинта.
- Если
5xx/timeout/connection refused— проблема у вас. - Ваш приёмник доступен из интернета? Проверьте:
- Эндпоинт отвечает
< 10 секунд? Если медленнее — мы считаем таймаут. - TLS-сертификат валидный? Self-signed не подходит.
- Не блокирует ли firewall наши egress-IP? (Мы можем менять их без предупреждения — не белолистите по IP.)
См. Ретраи.
caller_id отличается от phone¶
Симптом: webhook пришёл с type: "verification.completed", но
caller_id !== phone из исходного запроса.
Это нормально: значит, звонок был, но не с того номера, который пользователь ввёл при регистрации. Возможные причины:
- Пользователь намеренно позвонил с другого телефона.
- Перенаправление вызовов на другой номер.
- Маскировка caller-ID (редко).
Что делать: на вашей стороне отклонить верификацию. Не помечайте номер как подтверждённый. Покажите пользователю «номер не совпал».
Подпись webhook'а не проходит¶
См. Webhooks: подпись — раздел «Что делать при неудачной верификации».
Кратко: проверьте, что HMAC считается по <t>.<raw_body> (с точкой!),
секрет актуальный, тело — сырые байты до парсинга JSON.
404 на GET /verifications/{id}/¶
Возможные причины:
- Неверный
verification_id(опечатка). - Верификация принадлежит другой компании (другому API-ключу). Эндпоинт возвращает 404 а не 403, чтобы не раскрывать факт существования чужих ресурсов.
- Верификация была удалена согласно нашему retention policy (срок хранения данных верификаций — 90 дней).
Звонок не доходит / dial_number не отвечает¶
Это инцидент на нашей стороне. Проверьте:
dial_numberиз ответа набран полностью, включая+и код страны.- Звонок с другого телефона — может ваш оператор блокирует исходящие на этот номер.
- Дашборд → Status (если есть) или Twitter/Telegram-канал статусов.
Если стабильно — напишите в саппорт с verification_id, временем
звонка и номером, с которого звонили.
Где смотреть детали¶
Дашборд app.truenum.ru:
- Verifications — все ваши верификации, статусы, временные метки.
- Webhooks → Deliveries — каждая попытка доставки, HTTP-коды, тело запроса/ответа.
- Keys — список ключей,
last_used_at, можно отзывать.
Поддержка: реквизиты в дашборде → Account.