Bulk verification
Upload a CSV, poll the job, download results. Starter plan and up.
Submit
terminal
curl -X POST https://api.mxping.dev/v1/verify/bulk \
-H "Authorization: Bearer mxp_live_..." \
-F "file=@emails.csv" \
-F "callback_url=https://your-app.com/webhooks/mxping" # optionalOne email per row; a header row named email is skipped. Up to 100,000 rows and 25 MB. Duplicates are removed. Returns 202 with { "id", "status", "total_emails", "estimated_seconds" }. Credits are reserved per row as the job runs; if you run out mid-job the job completes with partial: true in the callback.
Poll
request
GET /v1/jobs/{id}
GET /v1/jobs?limit=50response.json
{
"id": "…",
"status": "processing", // pending | processing | completed | failed
"progress": { "total": 5000, "processed": 1200, "valid": 1010, "invalid": 190 },
"result_download_url": null, // presigned URL (1 h) once completed
"created_at": "…", "started_at": "…", "completed_at": null
}Callback webhook
On completion we POST a JSON body to callback_url with X-Mxping-Signature: t=<unix>,v1=<hex>, an HMAC-SHA256 of {t}.{body} using the secret from Settings. Retries with exponential backoff up to 5 times on non-2xx. Reject timestamps older than 5 minutes.
callback.json
{
"event": "bulk.completed",
"job_id": "…",
"status": "completed",
"partial": false,
"total": 5000, "processed": 5000, "valid": 4210, "invalid": 790,
"result_url": "https://…presigned…"
}