mxping
Docs navigation

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"   # optional

One 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=50
response.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…"
}