Bulk verification
Submit a list, let it run in the background, then page through the results or export them.
Submit a list#
POST/v1/bulk/verify1 credit per unique address, reserved up front
| Field | Type | Description |
|---|---|---|
| emails | string[] | 1 to 50,000 addresses. Duplicates are removed before charging. |
| name | string? | Label shown in the dashboard (max 120 chars). |
Example
curl https://new-project-rho-ecru.vercel.app/v1/bulk/verify \
-H "Authorization: Bearer vd_live_…" \
-H "Content-Type: application/json" \
-d '{"name":"October signups","emails":["a@example.com","b@example.com"]}'202 Accepted
{
"job": {
"id": "job_…",
"name": "October signups",
"status": "queued",
"source": "api",
"total": 2,
"processed": 0,
"counts": {},
"credits_reserved": 2,
"created_at": "2026-10-21T08:00:00.000Z",
"started_at": null,
"completed_at": null,
"expires_at": "2026-11-20T08:00:00.000Z",
"error": null
}
}Credits
The whole list is reserved atomically. If you do not have enough credits you get
402 insufficient_credits with available and required, and nothing is charged. Unused reservations are refunded if a job fails.Poll the job#
GET/v1/bulk/jobs/:idfree
| Field | Type | Description |
|---|---|---|
| results | "1"? | Include result rows. |
| status | enum? | Filter rows by status (valid, invalid, …). |
| limit | integer? | Rows per page, max 1000 (default 100). |
| offset | integer? | Row offset for paging. |
Example
curl https://new-project-rho-ecru.vercel.app/v1/bulk/jobs/job_…?results=1&status=invalid&limit=1000 \
-H "Authorization: Bearer vd_live_…"200 OK
{
"job": { "id": "job_…", "status": "completed", "total": 2, "processed": 2, "counts": { "valid": 1, "invalid": 1 }, … },
"results": [
{ "email": "b@example.com", "status": "invalid", "reason": "no_mx_records", "result": { "mx_hosts": [], "suggestion": null, … } }
],
"pagination": { "limit": 1000, "offset": 0, "total": 2 }
}Job status moves queued → processing → completed (or failed). Poll every few seconds; lists of a few thousand addresses usually finish within a minute. Results stay available for 30 days and can be exported as CSV from the Lists page.
Related