uCheckeruChecker

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

uChecker проверяет существование почтового ящика на уровне DNS/MX, SMTP-подключения и конкретного провайдера. Ответ однозначный: адрес принимает почту или нет — без промежуточных «возможно», которые всё равно приходится решать вручную.

Все запросы уходят на https://api.uchecker.net. Проверить любой эндпоинт можно поштучно или пакетом до миллионов адресов за одну задачу.

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

  1. 1. Получите API-ключ

    Ключ появляется в личном кабинете сразу после регистрации, отдельно запрашивать его не нужно.

  2. 2. Отправьте адрес на проверку

    curl -X POST https://api.uchecker.net/api/v1/validate/single \
      -H "x-api-key: uk_ВАШ_КЛЮЧ" \
      -H "Content-Type: application/json" \
      -d '{"email": "user@example.com"}'
  3. 3. Заберите результат по task_id из ответа

    curl https://api.uchecker.net/api/v1/tasks/123/results \
      -H "x-api-key: uk_ВАШ_КЛЮЧ"

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

Способа два, и они равноправны: оба дают полный доступ ко всем эндпоинтам. Выбор зависит от того, откуда идёт запрос.

API-ключ

Ключ передаётся в заголовке x-api-key, не истекает и живёт до ручного сброса. Для серверных интеграций брать стоит именно его — не нужно следить за сроками жизни токенов.

x-api-key: uk_xxxxxxxxxxxxx

Bearer-токен

JWT выдаётся методом POST /auth/login и передаётся в заголовке Authorization. Вариант для фронтенда, где вечный ключ в браузер класть нельзя.

Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
ТокенВремя жизниНазначение
access_token1 часАутентификация запросов
refresh_token7 днейОбновление access_token через POST /auth/refresh

Ключ виден в личном кабинете и там же сбрасывается, если его скомпрометировали. Старый ключ перестаёт работать сразу. app.uchecker.net

Кредиты и лимиты

Тарификация кредитная: одна проверка одного адреса стоит 1 кредит. Кредит списывается в момент постановки адреса в очередь, а не по факту ответа SMTP-сервера.

  • Ограничений на частоту запросов нет — отправляйте с той скоростью, которая нужна.
  • Адреса, не прошедшие синтаксическую проверку, при пакетной отправке не тарифицируются: они возвращаются в поле invalid_details, и платить за них не придётся.
  • Текущий остаток отдаёт GET /api/v1/account/balance.

Что означает результат

Каждый адрес получает одно из двух значений в поле validation_result. Третьего не предусмотрено: смысл сервиса в том, чтобы отдать решение, а не переложить его обратно.

ЗначениеЧто это значит
goodЯщик существует и принимает почту. Адрес можно оставлять в рассылке.
badЯщик не существует, отключён или домен почту не принимает. Причина — в поле result: mailbox_not_found, domain_not_found, smtp_rejected и другие.

Жизненный цикл задачи

Любой запрос на валидацию создаёт задачу. Результаты доступны только после того, как она дойдёт до состояния completed.

pending → processing → completed
                    ↘ failed
СостояниеЧто происходит
pendingЗадача создана и ждёт очереди. Код 0.
processingАдреса проверяются, прогресс виден в progress_percent. Код 1.
completedВсе адреса проверены, результаты можно забирать. Код 3.
failedЗадача упала — напишите в поддержку и приложите task_id. Код −1.

Опрашивать статус имеет смысл раз в 5–10 секунд. Либо передайте webhook_url при создании задачи — тогда мы сами postим результат, когда всё посчитается, и опрос не нужен вовсе.

Ошибки

Коды стандартные, тело ошибки всегда содержит success: false и человекочитаемое поле error.

КодКогда приходит
400Невалидные параметры или неверный формат данных.
401Ключ или токен отсутствует, просрочен либо неверен.
403На балансе не хватает кредитов.
404Задачи не существует или она принадлежит другому аккаунту.
500Ошибка на нашей стороне — повторите запрос.

Справочник эндпоинтов

Ниже — все публичные методы с параметрами и примерами. Адреса указаны без базового URL.

https://api.uchecker.net

Валидация и задачи

Постановка адресов в очередь, отслеживание прогресса и получение результатов.

Проверить один адрес

POST/api/v1/validate/singleНужен ключ

Адрес проходит синтаксическую проверку, встаёт в очередь и проверяется через DNS/MX, SMTP и провайдер-специфичные методы.

Если формат заведомо неверный, ответ приходит мгновенно со status: "invalid" и кредит не списывается. Иначе списывается 1 кредит и возвращается task_id. Проверка занимает от нескольких секунд до двух минут — дольше всего отвечают домены с жёсткими антиспам-политиками.

Параметры

  • emailstring· в теле· обязательный

    Адрес для проверки в формате RFC 5322.

  • webhook_urlstring· в теле· необязательный

    Куда прислать POST с результатом, когда проверка завершится. Адрес должен быть доступен извне и отвечать 200.

  • client_typestring· в теле· необязательный

    web | api

    Помечает источник запроса. Влияет только на формат внутренних уведомлений.

Запрос

{
  "email": "user@example.com",
  "webhook_url": "https://your-site.com/webhook/validation-complete"
}

Ответ 200

{
  "success": true,
  "task_id": 123,
  "email": "user@example.com",
  "status": "queued",
  "credits_used": 1,
  "credits_remaining": 999,
  "estimated_completion": "2024-01-01T12:00:30.000Z"
}

Проверить список адресов

POST/api/v1/validate/bulkНужен ключ

Основной способ работы с базами. Перед постановкой в очередь каждый адрес проверяется на синтаксис: кривые отсеиваются, не тарифицируются и возвращаются в invalid_details с причиной. Платите только за те, что реально ушли на проверку.

Передайте idempotency_key, если запрос может повториться из-за сетевого таймаута: повторный вызов с тем же ключом вернёт уже созданную задачу вместо второй такой же.

Параметры

  • emailsstring[]· в теле· обязательный

    Массив адресов. Невалидные по синтаксису будут исключены.

  • webhook_urlstring· в теле· необязательный

    Куда прислать POST с результатами всех проверок по завершении задачи.

  • idempotency_keystring· в теле· необязательный

    Произвольная уникальная строка — например, идентификатор импорта. Защищает от дублей при повторной отправке.

  • client_typestring· в теле· необязательный

    web | api

    Помечает источник запроса.

Запрос

{
  "emails": ["user1@example.com", "user2@example.com", "info@company.ru"],
  "idempotency_key": "import-2024-01-15-batch-3"
}

Ответ 200

{
  "success": true,
  "task_id": 124,
  "status": "queued",
  "total_emails": 100,
  "valid_emails": 95,
  "invalid_emails": 5,
  "invalid_details": [
    { "email": "bad-email", "reason": "Invalid email syntax" }
  ],
  "credits_used": 95,
  "credits_remaining": 904
}

Статус и прогресс задачи

GET/api/v1/tasks/{taskId}Нужен ключ

Показывает, на каком этапе задача и сколько адресов уже обработано. Результаты доступны только у задач в статусе completed, так что этот метод — то, что опрашивают между постановкой и выгрузкой.

Задача видна только тому аккаунту, который её создал.

Параметры

  • taskIdnumber· в пути· обязательный

    Идентификатор задачи из ответа на запрос валидации.

Ответ 200

{
  "success": true,
  "task_id": 123,
  "status": "processing",
  "total_emails": 100,
  "processed_emails": 45,
  "progress_percent": 45,
  "created_at": "2024-01-01T12:00:00.000Z",
  "finished_at": null
}

Результаты валидации

GET/api/v1/tasks/{taskId}/resultsНужен ключ

Отдаёт результат по каждому адресу задачи. У адресов со статусом bad заполнено поле result с причиной отказа.

Параметры

  • taskIdnumber· в пути· обязательный

    Идентификатор задачи.

  • formatstring· в строке запроса· необязательный· по умолчанию: json

    json | csv

    json отдаёт структуру, csv — тот же набор строкой с заголовками.

Ответ 200

{
  "success": true,
  "format": "json",
  "data": [
    { "email": "user1@example.com", "validation_result": "good" },
    {
      "email": "user2@example.com",
      "validation_result": "bad",
      "result": "mailbox_not_found"
    }
  ]
}

Скачать результаты в CSV

GET/api/v1/tasks/{taskId}/results/csvНужен ключ

То же, что format=csv у предыдущего метода, но ответ приходит файлом с заголовком Content-Disposition: attachment. Удобно, когда выгрузку нужно отдать прямо в браузер пользователя.

Параметры

  • taskIdnumber· в пути· обязательный

    Идентификатор задачи.

Ответ 200

Content-Type: text/csv
Content-Disposition: attachment; filename="results_123.csv"

email,validation_result,result
user1@example.com,good,
user2@example.com,bad,mailbox_not_found

Скачать good и bad списками

GET/api/v1/tasks/{taskId}/downloadНужен ключ

ZIP с двумя файлами: good.txt и bad.txt, по адресу на строку. Это формат, который сразу принимают почти все ESP при импорте — разбирать CSV не нужно.

Параметры

  • taskIdnumber· в пути· обязательный

    Идентификатор задачи.

Ответ 200

Content-Type: application/zip
Content-Disposition: attachment; filename="task_123.zip"

task_123.zip
├── good.txt
└── bad.txt

Аналитика по задаче

GET/api/v1/tasks/{taskId}/analyticsНужен ключ

Сводка по завершённой задаче: сколько адресов живых, сколько отсеяно, какой процент доставляемости получился и по каким причинам адреса не прошли.

Поле reasons показывает распределение отказов — по нему видно, что именно не так с базой: массовый domain_not_found означает опечатки в домене при сборе, а smtp_reject чаще говорит о старой базе.

Параметры

  • taskIdnumber· в пути· обязательный

    Идентификатор задачи.

Ответ 200

{
  "total": 100,
  "good": 80,
  "bad": 15,
  "unknown": 5,
  "deliverability": 80,
  "reasons": [
    { "key": "smtp_reject", "count": 12 },
    { "key": "domain_not_found", "count": 3 }
  ]
}

Список задач

GET/api/v1/tasksНужен ключ

История задач аккаунта с пагинацией, новые первыми.

Параметры

  • pagenumber· в строке запроса· необязательный· по умолчанию: 1

    Номер страницы, нумерация с единицы.

  • limitnumber· в строке запроса· необязательный· по умолчанию: 10

    Задач на страницу: от 1 до 100.

Ответ 200

{
  "success": true,
  "tasks": [
    {
      "task_id": 123,
      "fileName": "bulk_100_emails",
      "status": "completed",
      "created_at": "2024-01-01T12:00:00.000Z",
      "finished_at": "2024-01-01T12:01:35.000Z"
    }
  ],
  "total": 50,
  "page": 1,
  "limit": 10
}

Аккаунт и биллинг

Остаток кредитов, сводная статистика и история платежей.

Баланс аккаунта

GET/api/v1/account/balanceНужен ключ

Остаток кредитов, идентификатор аккаунта и маскированный ключ. Вызывайте перед большой выгрузкой, чтобы не упереться в 403 на середине.

Параметры

Параметров нет.

Ответ 200

{
  "success": true,
  "account_id": 123456,
  "credits_remaining": 1000,
  "api_key": "uk_xxxxx..."
}

Статистика аккаунта

GET/api/v1/account/statsНужен ключ

Сколько задач создано, сколько адресов проверено за всё время и какая средняя доставляемость получилась. В last_list — разбивка по последней задаче.

Параметры

Параметров нет.

Ответ 200

{
  "tasks_count": 42,
  "emails_checked": 12500,
  "avg_deliverability": 78,
  "last_list": { "total": 100, "good": 80, "bad": 15, "unknown": 5 }
}

История платежей

GET/api/v1/billing/historyНужен ключ

Список транзакций с пагинацией, новые первыми: сумма, статус, что именно куплено и идентификатор платежа.

Параметры

  • pagenumber· в строке запроса· необязательный· по умолчанию: 1

    Номер страницы, нумерация с единицы.

  • limitnumber· в строке запроса· необязательный· по умолчанию: 10

    Записей на страницу.

Ответ 200

{
  "data": [
    {
      "id": 1,
      "amount": 1000,
      "status": "completed",
      "product_details": "5000 addresses (5k) via freekassa from web",
      "creation_date": "2024-01-01T12:00:00.000Z",
      "payment_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    }
  ],
  "pagination": { "page": 1, "limit": 10, "total": 5, "totalPages": 1 }
}

ESP-провайдеры

Интерфейс для партнёров, которые заводят аккаунты и продают кредиты своим клиентам. Авторизация отдельным токеном, а не ключом аккаунта.

Рассчитать стоимость кредитов

GET/api/v1/esp/priceТокен ESP

Возвращает цену за указанный объём с учётом действующей для партнёра сетки. Считать на своей стороне не нужно — цена за адрес зависит от объёма.

Параметры

  • x-esp-tokenstring· заголовок· обязательный

    Токен партнёра, выдаётся при подключении.

  • countnumber· в строке запроса· обязательный

    Количество кредитов, минимум 1.

Ответ 200

{
  "success": true,
  "credits": 10000,
  "price": 2000,
  "price_per_email": 0.2,
  "currency": "RUB"
}

Создать аккаунт или пополнить кредиты

POST/api/v1/esp/provisionТокен ESP

Один метод на оба случая: если аккаунта с таким адресом нет — он создаётся и получает ключ, если есть — кредиты просто зачисляются. Что именно произошло, видно по флагу is_new_account.

Передавайте external_id — номер заказа на вашей стороне. По нему мы отсекаем повторную обработку того же платежа и возвращаем is_duplicate: true вместо второго зачисления.

Параметры

  • x-esp-tokenstring· заголовок· обязательный

    Токен партнёра, выдаётся при подключении.

  • emailstring· в теле· обязательный

    Адрес будущего или существующего аккаунта.

  • creditsnumber· в теле· обязательный

    Сколько кредитов зачислить.

  • external_idstring· в теле· необязательный

    Идентификатор заказа на стороне партнёра. Защищает от двойного зачисления.

Запрос

{
  "email": "user@example.com",
  "credits": 10000,
  "external_id": "order_12345"
}

Ответ 200

{
  "success": true,
  "account_id": 123,
  "email": "user@example.com",
  "api_key": "uk_xxxxxxxxxxxxx",
  "credits_added": 10000,
  "total_credits": 10000,
  "is_new_account": true,
  "is_duplicate": false
}

Попробовать вживую

Эта страница — справочник для чтения и поиска. Если нужно отправить запрос прямо из браузера и посмотреть на настоящий ответ, откройте интерактивную песочницу: там подставляется ваш ключ, а каждый эндпоинт можно вызвать кнопкой.

Открыть песочницу API

Частые вопросы

Сколько стоит проверка одного адреса через API?

Одна проверка — 1 кредит. Кредит списывается в момент постановки адреса в очередь. Адреса с неверным синтаксисом при пакетной отправке не тарифицируются: они отсеиваются до очереди и возвращаются в поле invalid_details.

Есть ли ограничение на частоту запросов?

Нет. Rate limits не выставлены, отправлять можно с любой скоростью. Упереться можно только в остаток кредитов — тогда придёт 403.

Сколько адресов можно отправить за один раз?

Пакетный метод принимает до миллионов адресов в одной задаче. Разбивать список на части ради обхода лимитов не нужно.

Как узнать, что проверка закончилась, не опрашивая статус?

Передайте webhook_url при создании задачи — когда все адреса проверены, на этот адрес уйдёт POST с результатами. Если webhook не подходит, опрашивайте GET /api/v1/tasks/:taskId раз в 5–10 секунд.

Чем API-ключ отличается от Bearer-токена?

Возможности одинаковые, разница в сроке жизни. Ключ в заголовке x-api-key не истекает и удобен для серверных интеграций. JWT живёт час, обновляется refresh-токеном и нужен там, где вечный ключ нельзя отдавать в браузер.

Что делать, если задача завершилась со статусом failed?

Напишите на support@uchecker.net и приложите task_id — по нему видно, на каком этапе задача упала. Кредиты за неотработавшую задачу возвращаются.

Можно ли протестировать API до оплаты?

Да. После регистрации на балансе есть бесплатные кредиты, а любой эндпоинт можно вызвать прямо из браузера в интерактивной песочнице.

Поддержка

Вопросы по интеграции — на support@uchecker.net. Если задача упала со статусом failed, приложите к письму task_id: по нему видно, что именно пошло не так.