Документация API
Загружайте номера, получайте расчёт стоимости, оформляйте заказы и скачивайте результаты по HTTP. Подходит для команд, которые обрабатывают данные массово и автоматизируют процессы. Правила те же, что и при заказе на сайте, а цены соответствуют вашему аккаунту.
Подключение API
- Попросите поддержку открыть для вас аккаунт.
- Сообщите поддержке нужные услуги, ваш аккаунт и исходящие IP ваших серверов.
- После этого мы выдадим API-ключ и полное руководство по интеграции. Ключи действуют от 1 до 730 дней, к каждому ключу можно привязать до 32 исходящих IP.
Основные правила
Базовый URL
https://api.checkim.ai/openapi/v1- Аутентификация
- Передавайте Authorization: Bearer <API-ключ> в каждом запросе
- User-Agent
- Обязателен. Запросы без него блокирует Cloudflare (error 1010)
- Формат
- Запросы и ответы в JSON, кодировка UTF-8, кроме загрузки файлов
- Время
- Временные метки UTC Unix в миллисекундах
- Суммы
- До восьми знаков после запятой. Используйте десятичный тип и не округляйте до двух знаков
Порядок интеграции
- Получите список услуг и проверьте баланс. Сохраните нужный productId.
- Прочитайте заявление об использовании данных и примите его, если ещё не сделали этого.
- Загрузите файл с номерами и сохраните полученный fileId.
- Получите расчёт стоимости по productId и fileId. Проверьте количество, цену за единицу и итоговую сумму.
- Создайте и сохраните ключ идемпотентности, затем оформите заказ. Сумма будет списана с баланса.
- Настройте вебхук для уведомлений о смене статуса и каждые 5–10 минут сверяйтесь через updatedSince, чтобы ничего не пропустить.
- Когда заказ завершится, получите список файлов результатов, скачайте каждый и проверьте его sha256. Неуспешные файлы тоже скачайте.
Пример на curl
Замените плейсхолдеры реальными значениями. Полный список параметров расчёта и заказа — в руководстве, которое вы получите вместе с доступом.
Укажите ключ и получите список услуг
export CHECKIM_TOKEN='замените на API-ключ от поддержки' export CHECKIM_BASE='https://api.checkim.ai/openapi/v1' curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/products"Загрузите файл с номерами
curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ -F 'file=@./numbers.csv;type=text/csv' \ "$CHECKIM_BASE/files"Получите расчёт стоимости
curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"productId":"<productId>","name":"batch-001","fileId":"<fileId>"}' \ "$CHECKIM_BASE/orders/check"Оформите заказ
# Списывает средства с баланса. При повторной попытке не меняйте ключ идемпотентности и тело запроса. curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ -H 'Content-Type: application/json' \ -H 'Idempotency-Key: partner-request-001' \ -d '{"quoteId":"<quoteId>","clientOrderId":"partner-batch-001"}' \ "$CHECKIM_BASE/orders"Получите заказ или сверьтесь по времени изменения
curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/orders/<orderId>" curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ "$CHECKIM_BASE/orders?updatedSince=<UTC ms>&size=100"Получите список результатов, скачайте их и проверьте sha256
curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/orders/<orderId>/results" curl -H "Authorization: Bearer $CHECKIM_TOKEN" -o result.csv \ "$CHECKIM_BASE/orders/<orderId>/results/<fileId>/download" shasum -a 256 result.csv
Эндпоинты
Аккаунт и заявление
| Эндпоинт | Назначение |
|---|---|
GET/compliance | Получить заявление об использовании данных и статус его принятия |
POST/compliance | Принять текущую версию заявления |
GET/balance | Получить баланс аккаунта |
GET/products | Список доступных услуг и ваши цены за единицу |
Файлы и расчёт
| Эндпоинт | Назначение |
|---|---|
POST/files | Загрузить файл с номерами (multipart, поле "file") |
POST/orders | Проверить номера и получить расчёт стоимости, действует 180 секунд |
Заказы
| Эндпоинт | Назначение |
|---|---|
POST/orders | Оформить заказ по расчёту; нужен заголовок Idempotency-Key |
GET/orders | Список заказов: постраничный вывод по курсору, фильтры по статусу и времени создания, сверка через updatedSince |
GET/orders | Получить статус заказа и количество |
POST/orders | Отменить заказ: заказы в очереди и ещё не переданные в работу сразу возвращаются полностью, переданные переходят в отмену, выполняющиеся отменить нельзя |
Результаты
| Эндпоинт | Назначение |
|---|---|
GET/orders | Список файлов результатов, у каждого есть sha256 |
GET/orders | Скачать один файл результатов, с докачкой через Range и If-None-Match |
Вебхук
| Эндпоинт | Назначение |
|---|---|
GET/webhook | Получить настройки вебхука и состояние доставки |
PUT/webhook | Задать адрес приёма и события для отправки |
DELETE/webhook | Отключить вебхук |
GET/webhook | Получить секрет подписи |
POST/webhook | Сменить секрет подписи; старый и новый подписывают 24 часа |
POST/webhook | Отправить тестовое событие |
GET/webhook | Список последних доставок |
Список заказов и сверка
- Заказы выводятся от новых к старым. Если на странице есть nextCursor, передайте его как cursor, чтобы получить следующую; постраничный вывод по курсору не пропускает и не повторяет заказы, даже когда появляются новые.
- Фильтруйте по status и времени создания (createdFrom, createdTo, миллисекунды UTC) или найдите заказ по clientOrderId.
- updatedSince возвращает только заказы, статус которых изменился после этого момента, от самого раннего изменения. Регулярно запрашивайте его — тогда пропущенный вебхук не приведёт к потере статуса.
Скачивание результатов
- У каждого файла в списке результатов есть sha256. ETag при скачивании — то же значение, сверьте его после загрузки.
- Запросы с Range позволяют докачать файл. Сначала убедитесь, что sha256 не изменился; если изменился, файл пересобран и его нужно скачать целиком заново.
- Если у вас уже есть полный файл, отправьте If-None-Match: при отсутствии изменений вернётся 304 без тела.
- Для крупных заказов с выдачей частями готовые части появляются в списке ещё во время выполнения; итоговый файл после завершения — основной.
- В услугах с аватарами (расширенная проверка и проверка пола и возраста в Telegram и WhatsApp) столбец avatar в CSV результата содержит подписанную ссылку на изображение, которую можно открыть прямым GET-запросом в течение срока хранения результатов (без заголовка Authorization; поддерживается If-None-Match).
Вебхуки
- Когда меняется статус заказа, оформленного через API, мы отправляем событие методом POST на ваш HTTPS-адрес. Нужно право webhook:manage.
- Каждое событие содержит заголовок CheckIM-Signature (t=метка времени,v1=подпись). Проверяйте его через HMAC-SHA256 от «t.исходное тело запроса» с вашим секретом подписи.
- Любой ответ 2xx считается доставкой; при ошибке делается 9 повторных попыток примерно за 2 дня. Одно событие может прийти несколько раз, поэтому убирайте дубли по его id.
- Запросы приходят с фиксированного IP 34.21.195.36, можно разрешить только его.
| Событие | Когда отправляется |
|---|---|
order.completed | Заказ рассчитан, результаты можно скачать |
order.cancelled | Заказ отменён с полным возвратом |
order.cancel_pending | Заказ отменяется и будет рассчитан после остановки выполнения |
order.needs_attention | Заказ передан на послепродажную поддержку или требует ручной обработки |
order.partial_results | Готова новая часть результатов для скачивания |
Статусы заказа
| Статус | Значение |
|---|---|
inQueue | В очереди. Продолжайте опрос |
orderTaken | Принят. Продолжайте опрос |
executing | Выполняется. Для крупных заказов с выдачей частями готовые части уже доступны |
completed | Готово. Скачайте результаты и сверьте количество |
waitAfterSale | Обрабатывается запрос на послепродажную поддержку |
pendingCancel | Отменяется. Продолжайте опрос до финального статуса |
cancelled | Отменён. Полный возврат, если заказ был в очереди; иначе оплачивается выполненная часть |
Лимиты и примечания
- По умолчанию не более 1 200 запросов в минуту с одного исходящего IP, 240 — на аккаунт и 120 — на ключ. Заголовки RateLimit-Limit, RateLimit-Remaining и RateLimit-Reset показывают, сколько запросов осталось в текущей минуте.
- Расчёт стоимости и загрузка выполняются долго, поэтому на аккаунт одновременно допускается не более 3 таких запросов. Остальные получают 429 TOO_MANY_CONCURRENT_REQUESTS.
- При ответе 429 или 503 подождите столько секунд, сколько указано в Retry-After, и повторите тот же запрос.
- Тестовой среды нет. Каждый заказ оплачивается по-настоящему.
- Тайм-аут при опросе не означает, что заказ не оформлен. Прежде чем заказывать повторно, найдите заказ по orderId или clientOrderId.
Частые ошибки
Ошибки содержат code, requestId, message и необязательное detail.field. Обрабатывайте их по code; message приходит на одном из 9 языков согласно Accept-Language и предназначено только для показа.
| Код | HTTP | Что делать |
|---|---|---|
INVALID_REQUEST | 400 | Исправьте параметр, указанный в detail.field |
INVALID_CURSOR | 400 | Курсор недействителен; начните с первой страницы |
INVALID_API_TOKEN | 401 | Проверьте, что ключ указан полностью, не истёк и не отозван |
PERMISSION_DENIED | 403 | Попросите поддержку проверить подключённые услуги и исходящие IP |
QUOTE_EXPIRED | 409 | Убедитесь, что заказ не был оформлен, и запросите расчёт заново |
INSUFFICIENT_BALANCE | 409 | Пополните баланс, затем снова запросите расчёт и оформите заказ |
ORDER_NOT_CANCELLABLE | 409 | Заказ уже выполняется или завершён, отменить его нельзя |
RETRY_SAME_REQUEST | 409 | Конфликт с другой операцией; повторите тот же запрос с нарастающей паузой |
COMPLIANCE_ACCEPTANCE_REQUIRED | 422 | Сначала прочитайте и примите заявление об использовании данных |
RATE_LIMITED | 429 | Подождите время из Retry-After и отправляйте запросы реже |
TOO_MANY_CONCURRENT_REQUESTS | 429 | Дождитесь завершения предыдущего расчёта или загрузки |
DATABASE_UNAVAILABLE | 503 | Временно недоступно; повторите после Retry-After |
Нужен доступ к API?
Сообщите поддержке нужные услуги и ваши исходящие IP. Мы выдадим ключ и полное руководство с примером клиента на Python.