Responses
Every check returns the same envelope. Only details differs by endpoint; the API reference documents each one.
{ "success": true, "data": { "request": { "id": "req_9f1f…", "type": "email", "input": { "email": "jane@example.com" }, "timestamp": "2026-10-15T22:28:06.372Z", "processing_time_ms": 412 }, "metadata": { "api_version": "1", "credits_used": 1, "credits_remaining": 18420, "cache_hit": false, "test_mode": false, "data_sources": ["syntax", "dns", "smtp"] }, "verdict": { "status": "valid", "reason": "mailbox_exists" }, "risk": { "score": 5, "level": "low", "factors": ["free_provider"], "confidence": "high" }, "details": { "…": "product-specific" }, "recommendation": { "action": "approve", "message": "Safe to accept." }, "partial": false }}| Field | What it’s for |
|---|---|
verdict |
What we found. status is the headline; reason is a stable code you can branch on. |
risk.score |
0 (no risk) to 100. level buckets it: low below 25, medium below 50, high below 75, then critical. |
risk.factors |
Every signal that added to the score. |
recommendation.action |
approve, verify, review, or block. The simplest thing to branch on. |
partial |
true if a data source timed out; some fields are null. Partial answers aren’t cached. |
Headers
Section titled “Headers”| Header | On | Meaning |
|---|---|---|
X-Request-Id |
Every response | Same as data.request.id. Include it when you contact support. |
X-Credits-Used |
Successful checks | Credits this request used. |
X-Credits-Remaining |
Live checks and 402s | Your balance after this request. |
X-RateLimit-Limit, -Remaining, -Reset |
Every check | See Rate limits. |
Idempotent-Replay |
Replays | true when the response is a stored replay. See Idempotency. |