API Reference
Complete email checker API reference. Endpoints, parameters, response codes for email verification and validation.
Посмотрите, как это работает
Как проверить список email через API проверки email
Как проверить список email через API проверки email: загрузите CSV в /verify/file, отслеживайте задачу по ID и скачайте результаты в CSV, отфильтрованные или полные. Затем замените опрос webhook: зарегистрируйте HTTPS-адрес для file.completed и file.failed и проверяйте подпись каждой доставки своим секретом.
BillionVerify API - это RESTful-сервис, предоставляющий мощные возможности верификации email. Все API-запросы должны выполняться через HTTPS.
Базовый URL
https://api.billionverify.com/v1Спецификация OpenAPI
Полная спецификация API доступна в формате OpenAPI 3.0:
- OpenAPI YAML: https://api.billionverify.com/openapi.yaml
- Интерактивная документация API: https://api.billionverify.com/docs
Вы можете импортировать спецификацию OpenAPI в такие инструменты, как Postman, Insomnia, или использовать её для генерации клиентских библиотек.
Аутентификация
Все API-запросы требуют аутентификации с использованием Bearer-токена в заголовке Authorization:
BILLIONVERIFY-API-KEY: YOUR_API_KEYПолучите API-ключ в панели управления BillionVerify.
Пример
curl -X POST https://api.billionverify.com/v1/verify/single \
-H "BILLIONVERIFY-API-KEY: sk_xxx" \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com"}'Лимиты запросов
| Эндпоинт | Лимит |
|---|---|
Одиночная верификация (/verify/single) | 6 000 запросов/минуту |
Массовая верификация (/verify/bulk) | 1 500 запросов/минуту |
Загрузка файла (/verify/file) | 300 запросов/минуту |
Проверка одноразовых email (/verify/disposable) | 6 000 запросов/минуту |
Другие эндпоинты (/credits, /webhooks и др.) | 600 запросов/минуту |
Информация о лимитах включена в заголовки ответа:
| Заголовок | Описание |
|---|---|
X-RateLimit-Limit | Максимальное количество разрешённых запросов |
X-RateLimit-Remaining | Оставшееся количество запросов в текущем окне |
X-RateLimit-Reset | Unix-время сброса лимита |
При превышении лимита вы получите ответ 429 Too Many Requests:
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please try again later.",
"retry_after": 3600
}
}Эндпоинты
Верификация одного email
Проверка одного email-адреса с детальными результатами.
POST /verify/singleЗапрос
{
"email": "user@example.com",
"check_smtp": false
}Параметры
| Параметр | Тип | Обязателен | По умолчанию | Описание |
|---|---|---|---|---|
email | string | Да | - | Email-адрес для проверки |
check_smtp | boolean | Нет | true | Проверка SMTP-почтового ящика в реальном времени |
force_refresh | boolean | Нет | false | Пропустить кэш и принудительно выполнить проверку |
Ответ
{
"email": "user@example.com",
"status": "valid",
"result": {
"deliverable": true,
"valid_format": true,
"valid_domain": true,
"valid_mx": true,
"disposable": false,
"role": false,
"catchall": false,
"free": false,
"smtp_valid": true
},
"score": 0.95,
"reason": null,
"credits_used": 1
}Поля ответа
| Поле | Тип | Описание |
|---|---|---|
email | string | Проверенный email-адрес |
status | string | Статус верификации: valid, invalid, unknown, catchall |
result | object | Детальные результаты верификации |
score | number | Оценка уверенности (0.0 - 1.0) |
reason | string | Причина статуса invalid/unknown (может быть null) |
credits_used | integer | Количество использованных кредитов |
Поля объекта result
| Поле | Тип | Описание |
|---|---|---|
deliverable | boolean | Может ли email получать сообщения |
valid_format | boolean | Корректен ли синтаксис email |
valid_domain | boolean | Существует ли домен |
valid_mx | boolean | Есть ли у домена MX-записи |
disposable | boolean | Является ли email одноразовым сервисом |
role | boolean | Является ли email ролевым (info@, support@) |
catchall | boolean | Принимает ли домен все письма |
free | boolean | Является ли email от бесплатного провайдера |
smtp_valid | boolean | Прошла ли SMTP-верификация |
Пакетная верификация email
Синхронная верификация нескольких email-адресов. Подходит для небольших пакетов (максимум 50 email).
POST /verify/bulkЗапрос
{
"emails": ["user1@example.com", "user2@example.com", "user3@example.com"],
"check_smtp": false
}Параметры
| Параметр | Тип | Обязателен | По умолчанию | Описание |
|---|---|---|---|---|
emails | array | Да | - | Массив email-адресов (макс: 50) |
check_smtp | boolean | Нет | true | Выполнять SMTP-верификацию |
Ответ
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"results": [
{
"email": "user1@example.com",
"status": "valid",
"score": 0.95,
"is_deliverable": true,
"is_disposable": false,
"is_catchall": false,
"is_role": false,
"is_free": false,
"domain": "example.com",
"check_smtp": false,
"reason": null,
"credits_used": 1
}
],
"total_emails": 3,
"valid_emails": 2,
"invalid_emails": 1,
"credits_used": 3,
"process_time": 2500
}
}Проверка кредитов
Получение текущего баланса кредитов и информации об использовании.
GET /creditsОтвет
{
"available": 9500,
"used": 500,
"total": 10000,
"plan": "Professional",
"resets_at": "2025-02-01T00:00:00Z",
"rate_limit": {
"requests_per_hour": 10000,
"remaining": 9850
}
}Проверка одноразовых email
Проверьте, относится ли email-адрес к известному провайдеру одноразовых (временных) email. Этот эндпоинт бесплатный — он выполняет поиск домена в памяти и не расходует кредиты.
POST /verify/disposable
GET /verify/disposable?email=user@example.comЗапрос (POST)
{
"email": "user@example.com"
}Параметры
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
email | string | Да | Email-адрес для проверки |
Примечания
- Этот эндпоинт не расходует кредиты.
check_smtpне поддерживается. Для полной SMTP-верификации используйте/verify/single,/verify/bulkили/verify/fileсcheck_smtp: true.- Поддерживается как
POSTс JSON-телом, так иGETс параметром запроса?email=.
Ответ
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"email": "user@mailnull.com",
"domain": "mailnull.com",
"is_disposable": true,
"checked_at": "2026-05-19T10:00:00Z"
}
}Поля ответа
| Поле | Тип | Описание |
|---|---|---|
email | string | Нормализованный email-адрес (в нижнем регистре) |
domain | string | Доменная часть email (ASCII / Punycode) |
is_disposable | boolean | true, если домен является известным одноразовым |
checked_at | string | Метка времени UTC проверки (RFC 3339) |
Верификация файла
Загрузите файл с email-адресами для массовой проверки. Поддерживаются файлы CSV, Excel и текстовые файлы.
POST /verify/file
Content-Type: multipart/form-dataЗапрос
| Поле | Тип | Обязателен | Описание |
|---|---|---|---|
file | file | Да | Файл с email-адресами (CSV, XLSX, TXT), без ограничения размера или числа строк на уровне приложения |
Ответ
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
"file_name": "emails.csv",
"total_emails": 1000,
"status": "processing",
"created_at": "2026-02-04T10:30:00Z"
}
}Получение статуса задания файла
Проверка статуса задания верификации файла.
GET /verify/file/{job_id}Ответ
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
"file_name": "emails.csv",
"status": "completed",
"total_emails": 1000,
"valid_emails": 850,
"invalid_emails": 100,
"role_emails": 30,
"catchall_emails": 10,
"unknown_emails": 10,
"disposable_emails": 0,
"credits_used": 990,
"progress_percent": 100,
"created_at": "2026-02-04T10:30:00Z",
"completed_at": "2026-02-04T10:35:00Z"
}
}Скачать результаты задания файла
Скачивание результатов верификации для завершённого задания.
GET /verify/file/{job_id}/resultsПараметры запроса
| Параметр | Тип | Описание |
|---|---|---|
valid | boolean | Фильтровать только валидные email |
invalid | boolean | Фильтровать только невалидные email |
catchall | boolean | Включить catch-all email |
role | boolean | Включить ролевые email |
Ответ
Возвращает CSV-файл с результатами верификации.
Вебхуки
Получайте уведомления в реальном времени о завершении заданий верификации файлов.
Создание вебхука
POST /webhooksЗапрос
{
"url": "https://your-app.com/webhooks/billionverify",
"events": ["file.completed", "file.failed"]
}Параметры
| Параметр | Тип | Обязателен | Описание |
|---|---|---|---|
url | string | Да | HTTPS URL для получения уведомлений вебхука |
events | array | Да | События для подписки |
Ответ
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"id": "673f3bff-81ea-4730-9cef-af1eb7f134bf",
"url": "https://your-app.com/webhooks/billionverify",
"events": ["file.completed", "file.failed"],
"secret": "5c609e6893ab3b65ce8940549a030bc165762fe171e0b38f880bd570099619bf",
"is_active": true,
"created_at": "2026-02-04T10:30:00Z",
"updated_at": "2026-02-04T10:30:00Z"
}
}Важно: secret возвращается только при создании вебхука. Храните его
безопасно — он понадобится для проверки подписей вебхуков.
Список вебхуков
GET /webhooksОтвет
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"webhooks": [
{
"id": "673f3bff-81ea-4730-9cef-af1eb7f134bf",
"url": "https://your-app.com/webhooks/billionverify",
"events": ["file.completed", "file.failed"],
"is_active": true,
"created_at": "2026-02-04T10:30:00Z",
"updated_at": "2026-02-04T10:30:00Z"
}
],
"total": 1
}
}Удаление вебхука
DELETE /webhooks/{webhook_id}Ответ
{
"success": true,
"code": "0",
"message": "Success",
"data": {
"message": "Webhook deleted successfully",
"webhook_id": "673f3bff-81ea-4730-9cef-af1eb7f134bf"
}
}События вебхуков
| Событие | Описание |
|---|---|
file.completed | Задание верификации файла успешно завершено |
file.failed | Задание верификации файла завершилось с ошибкой |
Полезная нагрузка вебхука
При возникновении события мы отправляем POST-запрос на ваш URL вебхука:
{
"event": "file.completed",
"timestamp": "2026-02-04T10:35:00Z",
"data": {
"job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
"file_name": "emails.csv",
"total_emails": 1000,
"valid_emails": 850,
"invalid_emails": 100,
"role_emails": 30,
"catchall_emails": 10,
"unknown_emails": 10,
"disposable_emails": 0,
"credits_used": 990,
"process_time_seconds": 125.5,
"download_url": "https://api.billionverify.com/v1/verify/file/7143874e-21c5-43c1-96f3-2b52ea41ae6a/results",
"direct_download_url": "https://download.example.com/results_7143874e.csv?signature=...",
"direct_download_expires_at": "2026-02-04T11:35:00Z"
}
}Заголовки вебхука
| Заголовок | Описание |
|---|---|
X-Webhook-Event | Тип события (напр. file.completed) |
X-Webhook-Signature | Подпись HMAC-SHA256 для верификации |
X-Webhook-Timestamp | Unix-метка времени отправки вебхука |
User-Agent | BillionVerify-Webhook/1.0 |
Проверка подписей вебхуков
Чтобы убедиться, что вебхук отправлен BillionVerify, вычислите подпись HMAC-SHA256:
const crypto = require('crypto');
function verifyWebhookSignature(rawBody, timestamp, signature, secret) {
const signedPayload = `${timestamp}.${rawBody}`;
const expectedSignature =
'sha256=' +
crypto.createHmac('sha256', secret).update(signedPayload).digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature),
);
}import hmac
import hashlib
def verify_webhook_signature(raw_body: bytes, timestamp: str, signature: str, secret: str) -> bool:
signed_payload = timestamp.encode() + b"." + raw_body
expected = 'sha256=' + hmac.new(
secret.encode(),
signed_payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)Статусы верификации
| Статус | Оценка | Значение | Рекомендуемое действие |
|---|---|---|---|
valid | 0.9+ | Email существует и может получать сообщения | Безопасно отправлять |
invalid | 0.1 | Email не существует или не может получать | Удалить из списка |
unknown | 0.5 | Не удалось определить валидность | Повторить позже или действовать с осторожностью |
risky | 0.30 | Письмо дойдёт, но у домена подтверждённая история злоупотреблений | Удалить из списка |
disposable | 0.3 | Email от одноразового сервиса | Рассмотреть удаление |
catchall | 0.7 | Домен принимает все письма (catch-all) | Отслеживать возвраты |
role | 0.6 | Ролевой email (info@, support@) | Обычно доставляется, может иметь низкую вовлечённость |
Изменено 2026-08-04. Раньше
riskyозначало «мы не смогли завершить проверку» (внутренний откат по ёмкости SMTP), допускало повтор и не тарифицировалось. Теперь этот случай возвращается какunknownс прежней причинойmx_only_verification_semaphore_timeout; поведение и тарификация не изменились. Если ваша интеграция трактуетriskyкак «повторить позже», её нужно обновить.
Ответы об ошибках
Все ошибки следуют единому формату:
{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable error message",
"details": "Additional context (optional)"
}
}HTTP-коды статуса
| Код | Описание |
|---|---|
200 | Успех |
400 | Неверный запрос - Некорректные параметры |
401 | Не авторизован - Неверный или отсутствующий API-ключ |
403 | Запрещено - Недостаточно прав |
404 | Не найдено - Ресурс не существует |
429 | Слишком много запросов - Превышен лимит |
500 | Внутренняя ошибка сервера |
503 | Сервис недоступен |
Коды ошибок
| Код | HTTP-статус | Описание |
|---|---|---|
INVALID_API_KEY | 401 | API-ключ неверен или отсутствует |
RATE_LIMIT_EXCEEDED | 429 | Слишком много запросов |
INSUFFICIENT_CREDITS | 403 | Недостаточно кредитов |
INVALID_EMAIL | 400 | Формат email некорректен |
INVALID_REQUEST | 400 | Тело запроса некорректно |
JOB_NOT_FOUND | 404 | ID пакетного задания не найден |
TIMEOUT | 504 | Таймаут верификации |
Лучшие практики
1. Используйте переменные окружения
Никогда не храните API-ключи в коде:
// Правильно
const apiKey = process.env.BV_API_KEY;
// Неправильно - не делайте так
const apiKey = 'sk_xxx';2. Обрабатывайте лимиты запросов
Реализуйте экспоненциальную задержку:
async function verifyWithRetry(email, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await verify(email);
} catch (error) {
if (error.code === 'RATE_LIMIT_EXCEEDED') {
await sleep(Math.pow(2, i) * 1000);
continue;
}
throw error;
}
}
}3. Используйте пакетную обработку для множества email
Для проверки более 10 email используйте пакетный эндпоинт:
// Правильно - один API-вызов
const job = await client.verifyBulk(emails);
// Неправильно - много отдельных вызовов
for (const email of emails) {
await client.verify(email);
}4. Используйте вебхуки для пакетных заданий
Не опрашивайте постоянно; используйте вебхуки:
// Отправка с вебхуком
const job = await client.verifyBulk(emails, {
webhookUrl: 'https://your-app.com/webhook',
});SDK
Используйте наши официальные SDK для упрощения интеграции: