API Reference
Complete email checker API reference. Endpoints, parameters, response codes for email verification and validation.
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:
BV-API-KEY: YOUR_API_KEYПолучите API-ключ в панели управления BillionVerify.
Пример
curl -X POST https://api.billionverify.com/v1/verify/single \
-H "BV-API-KEY: bv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com"}'Лимиты запросов
| Тариф | Запросов/Час | Запросов/День |
|---|---|---|
| Free | 100 | 1,000 |
| Starter | 1,000 | 10,000 |
| Professional | 10,000 | 100,000 |
| Enterprise | Индивидуально | Индивидуально |
Информация о лимитах включена в заголовки ответа:
| Заголовок | Описание |
|---|---|
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": true
}Параметры
| Параметр | Тип | Обязателен | По умолчанию | Описание |
|---|---|---|---|---|
email | string | Да | - | Email-адрес для проверки |
smtp_check | boolean | Нет | true | Выполнять SMTP-проверку почтового ящика |
timeout | integer | Нет | 5000 | Таймаут запроса в миллисекундах (макс: 30000) |
Ответ
{
"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": true
}Параметры
| Параметр | Тип | Обязателен | По умолчанию | Описание |
|---|---|---|---|---|
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",
"smtp_check": true,
"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-адресами для массовой проверки. Поддерживаются файлы CSV, Excel и текстовые файлы.
POST /verify/file
Content-Type: multipart/form-dataЗапрос
| Поле | Тип | Обязателен | Описание |
|---|---|---|---|
file | file | Да | Файл с email-адресами (CSV, XLSX, XLS, TXT). Макс 20MB |
Ответ
{
"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,
"result_file_path": "results/2026/02/04/result_xxx.csv",
"download_url": ""
}
}Заголовки вебхука
| Заголовок | Описание |
|---|---|
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(payload, signature, secret) {
const expectedSignature = 'sha256=' +
crypto.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
}import hmac
import hashlib
def verify_webhook_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = 'sha256=' + hmac.new(
secret.encode(),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)Статусы верификации
| Статус | Оценка | Значение | Рекомендуемое действие |
|---|---|---|---|
valid | 0.9+ | Email существует и может получать сообщения | Безопасно отправлять |
invalid | 0.1 | Email не существует или не может получать | Удалить из списка |
unknown | 0.5 | Не удалось определить валидность | Повторить позже или действовать с осторожностью |
risky | 0.4 | Email может иметь проблемы с доставкой | Действовать с осторожностью, отслеживать возвраты |
disposable | 0.3 | Email от одноразового сервиса | Рассмотреть удаление |
catchall | 0.7 | Домен принимает все письма (catch-all) | Отслеживать возвраты |
role | 0.6 | Ролевой email (info@, support@) | Обычно доставляется, может иметь низкую вовлечённость |
Ответы об ошибках
Все ошибки следуют единому формату:
{
"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 = 'bv_live_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 для упрощения интеграции: