VADER API

Email validation infrastructure. 30+ IP across 3 continents. Per-provider routing, catch-all detection, Mail.ru-specialized adapter, MailWizz integration.

🇷🇺 RU 🇰🇿 KZ 🇪🇺 EU 🇺🇸 US v0.4.0 REST API OpenAPI 3
Начать Swagger UI

🚀 Quickstart

1. Получить API key

Обратись к админу или создай через master token:

curl -X POST https://vader.orm-bin.ru/api/admin/keys \
  -H "Authorization: Bearer <MASTER_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"name": "My App", "permissions": {"verify": true, "batch": true}, "rate_limit": 1000}'

В ответе будет key — сохрани, он показывается один раз:

{
  "id": 1,
  "key": "vdr_6QdLeb3P7IRZ6WFvOGhWiP1mfeLSfU2bV5fAHHLiW6g",
  "prefix": "vdr_6QdLeb3P"
}

2. Проверить один email

curl -X POST https://vader.orm-bin.ru/api/verify \
  -H "Authorization: Bearer vdr_6QdLeb3P..." \
  -H "Content-Type: application/json" \
  -d '{"email": "test@mail.ru"}'

3. Загрузить CSV для batch

curl -X POST https://vader.orm-bin.ru/api/batch \
  -H "Authorization: Bearer vdr_..." \
  -F "file=@list.csv" \
  -F "name=My batch" \
  -F "junk_filter=true" \
  -F "split_multi=true" \
  -F "webhook_url=https://my-app.com/hook"

🔑 Authorization

Все запросы требуют заголовок Authorization: Bearer <token>.

Типы токенов

ТипФорматИспользование
Master Token hex (64 chars) Admin доступ ко всем endpoints включая /api/admin/*
Client Key vdr_* Permissions ограничены (verify/batch/mailwizz), rate limit per hour
⚠️ Client key показывается ТОЛЬКО при создании. Только SHA-256 хеш сохраняется в БД — восстановить невозможно. Сохраняй сразу в менеджер паролей.

Permissions

PermissionДоступ
adminПолный — управление ключами, всё что угодно
verifyPOST /api/verify (single email)
batchPOST /api/batch, /api/batch/preview, /api/process-cards
mailwizzPush в MailWizz
statsGET /api/stats и аналитика

🛰 Endpoints

Validation

POST /api/verify

Проверить один email в реальном времени (~1-2 сек)

{"email": "user@example.com"}

POST /api/batch/preview

Превью CSV — статистика junk/duplicates/multi-cell до запуска

multipart/form-data: file=@list.csv

POST /api/batch

Запустить batch валидацию CSV. Поддерживает webhook_url для уведомления о завершении.

multipart/form-data:
  file=@list.csv (или cache_key из preview)
  name=My Batch
  junk_filter=true
  split_multi=true
  deduplicate=true
  webhook_url=https://...

POST /api/process-cards

Full pipeline: JSON-карточки → split → filter → validate → MailWizz push → webhook

{
  "cards": [
    {"email": "ivan@x.com", "company": "ООО Тест", "name": "Иван"},
    {"email": "sales@y.com, info@y.com", "company": "Y Ltd"}
  ],
  "name": "API Batch",
  "junk_filter": true,
  "split_multi": true,
  "mailwizz_server": "rf-email-1",
  "mailwizz_list_uid": "hn2cssaw7jaf2",
  "webhook_url": "https://..."
}

Jobs

GET /api/jobs?limit=30&search=...&status=running

Список последних jobs с поиском и фильтром

GET /api/jobs/{id}

Статус job — progress, counts, quality_score

GET /api/jobs/{id}/breakdown

Разбивка по провайдерам с Valid/Risky/Invalid

GET /api/jobs/{id}/validations

Постранично все валидации с фильтрами status/provider/search

GET /api/jobs/{id}/download?only=valid&mw_format=true

Скачать CSV. only: valid / valid_risky / invalid / risky / all. mw_format=true для MailWizz формата (Email без кавычек, остальные в "")

POST /api/jobs/{id}/stop

Остановить running job

POST /api/jobs/{id}/restart

Перезапустить (продолжит с того места)

PATCH /api/jobs/{id}

Переименовать. {"name": "..."}

MailWizz

GET /api/mailwizz/servers

Список 6 серверов (RU x2, USA x2, EU x2) с гео

GET /api/mailwizz/{server}/lists

Подписчик-листы сервера

POST /api/mailwizz/push

Залить job → MailWizz list

{
  "job_id": 5,
  "server": "rf-email-1",
  "list_uid": "hn2cssaw7jaf2",
  "only_status": "valid"
}

Stats & Health

GET /api/health

Базовая проверка (public, без auth)

GET /api/health/full

Master + probe-ноды + 24h-статистика

GET /api/stats

Полная статистика валидаций

GET /api/stats/providers

По провайдерам за 24ч с fail-rate

GET /api/stats/timeline?days=7

Валидации по дням

GET /api/search?q=email

Глобальный поиск по всей истории валидаций

Admin (master token only)

POST /api/admin/keys

Создать API key

GET /api/admin/keys

Список всех keys (метаданные)

PATCH /api/admin/keys/{id}

Включить/отключить, менять rate_limit

DELETE /api/admin/keys/{id}

Удалить ключ полностью

💻 Examples

Python (requests)

import requests

TOKEN = 'vdr_6QdLeb3P7IRZ6WFvOGhWiP1mfeLSfU2bV5fAHHLiW6g'
BASE = 'https://vader.orm-bin.ru'

# Single verify
r = requests.post(f'{BASE}/api/verify',
    headers={'Authorization': f'Bearer {TOKEN}'},
    json={'email': 'test@mail.ru'})
print(r.json())

# Full pipeline — leads to MailWizz
r = requests.post(f'{BASE}/api/process-cards',
    headers={'Authorization': f'Bearer {TOKEN}'},
    json={
        'cards': [
            {'email': 'ivan@x.com', 'company': 'ООО Тест', 'name': 'Иван'},
        ],
        'name': 'API Batch',
        'mailwizz_server': 'rf-email-1',
        'mailwizz_list_uid': 'hn2cssaw7jaf2',
        'webhook_url': 'https://my-app.com/hook'
    })
job_id = r.json()['job_id']
print('Started job:', job_id)

Node.js (fetch)

const TOKEN = 'vdr_6QdLeb3P7IRZ6WFvOGhWiP1mfeLSfU2bV5fAHHLiW6g';
const BASE = 'https://vader.orm-bin.ru';

const res = await fetch(`${BASE}/api/verify`, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({email: 'test@mail.ru'}),
});
const data = await res.json();
console.log(data);

cURL

# Verify
curl -X POST https://vader.orm-bin.ru/api/verify \
  -H "Authorization: Bearer vdr_..." \
  -H "Content-Type: application/json" \
  -d '{"email": "test@mail.ru"}'

# Batch CSV upload
curl -X POST https://vader.orm-bin.ru/api/batch \
  -H "Authorization: Bearer vdr_..." \
  -F "file=@list.csv" \
  -F "name=My batch" \
  -F "junk_filter=true"

# Download cleaned CSV
curl -O -J -H "Authorization: Bearer vdr_..." \
  "https://vader.orm-bin.ru/api/jobs/5/download?only=valid&mw_format=true"

🔔 Webhooks

При завершении job (если был webhook_url) на твой URL отправится POST:

{
  "job_id": 5,
  "name": "API Batch",
  "status": "completed",
  "processed": 1500,
  "valid": 850,
  "risky": 350,
  "invalid": 300,
  "quality_score": 78
}

⚠️ Errors

CodeMeaning
401Missing Bearer token
403Invalid token / IP not allowed / missing permission
404Job/key not found
413File too large (max 50 MB / 50K cards)
429Rate limit exceeded (per hour)
500Internal error
502MailWizz upstream error

📊 Rate limits & quotas