API Documentation
Everything you need to integrate BounceZero email verification into your application.
Base URL: https://api.bouncezero.io
Authentication
All API requests require an API key passed in the X-API-Key header.
- Log in to your dashboard
- Navigate to Settings > API Keys
- Click Generate API Key
- Copy your key (starts with
bz_live_)
X-API-Key: bz_live_your_key_here
Keep your API key secret. Do not expose it in client-side code or public repositories.
Single Email Verification
/api/v1/verify
JSON Body
| Parameter | Type | Description |
|---|---|---|
| string | Email address to verify (required) | |
| depth | string | Verification depth: standard (default), deep, ultra |
Example Response
{
"email": "[email protected]",
"score": 95,
"classification": "valid",
"is_deliverable": true,
"risk_level": "low",
"checks": {
"syntax": true,
"domain_valid": true,
"not_disposable": true,
"not_catch_all": true,
"mailbox_verified": true
},
"metadata": {
"internal_classification": "verified",
"refunded": null,
"catch_all_unresolved": null
},
"explanation": "Mailbox exists and is deliverable"
}
Bulk Verification
Upload a CSV file of emails for batch verification. Three endpoints are used in sequence. To send a JSON list instead (up to 10,000 emails), POST /api/v1/verify/bulk with {"emails": [...]} and an optional Idempotency-Key header.
1. Upload CSV
/api/v1/verify/bulk/upload
Send a multipart/form-data request with a CSV file (form field file) containing one email per row, or a header row with an email column.
# Response
{
"job_id": "a1b2c3d4-e5f6-...",
"total_emails": 5000,
"deduplicated": 4812,
"status": "queued"
}
2. Check Status
/api/v1/verify/bulk/{job_id}/status
{
"job_id": "a1b2c3d4-e5f6-...",
"status": "processing",
"progress": {
"total": 4812,
"completed": 3200,
"percent": 66.5
}
}
Statuses: queued, processing, interrupted (resumes automatically, keep polling), and the final states completed, failed, stopped, credits_exhausted.
3. Get Results
/api/v1/verify/bulk/{job_id}/results
Returns results as JSON, paginated with ?limit= (max 5000) and ?offset=. For a CSV file use GET /api/v1/verify/bulk/{job_id}/download.
Response Fields
| Field | Type | Description |
|---|---|---|
| classification | string | Verification result: valid or invalid |
| score | integer | Deliverability score from 0 to 100 |
| is_deliverable | boolean | True when classification is valid |
| risk_level | string | low, medium or high |
| checks.mailbox_verified | boolean | Whether the mailbox was confirmed by the SMTP RCPT TO probe or provider check |
| checks.domain_valid | boolean | Whether the domain has valid MX records |
| checks.not_disposable | boolean | False when the email uses a disposable/temporary domain |
| checks.not_catch_all | boolean | False when the domain accepts all email addresses |
| metadata.internal_classification | string | Detailed verdict: verified, likely_valid, catch_all, invalid, disposable, risky, spamtrap, unknown or error |
| metadata.refunded | boolean | True when the address could not be verified (reported invalid, credit refunded automatically) |
| explanation | string | Human-readable explanation of the result |
Result Values
| Value | Meaning |
|---|---|
| valid | The email address exists and is deliverable |
| invalid | The email address does not exist or is undeliverable |
| catch_all_unresolved | Metadata flag on a valid result: the domain is a catch-all and the individual mailbox could not be resolved |
| refunded | Metadata flag on an invalid result: the address could not be verified and the credit was refunded automatically |
Score
Each email receives a deliverability score from 0 to 100. This score combines SMTP probing, DNS validation, provider-specific checks, and machine learning signals.
Error Codes
| Status | Meaning | What to do |
|---|---|---|
| 401 | Invalid or missing API key | Check your X-API-Key header |
| 402 | Insufficient credits | Top up credits at bouncezero.io/pricing |
| 422 | Invalid input | Check the email format or request body |
| 429 | Rate limit exceeded | Slow down requests. Limits depend on your plan. |
Webhooks
Receive notifications when bulk jobs complete. Configure your webhook URL in Dashboard > Settings > Webhooks.
Payload
{
"event": "bulk.completed",
"job_id": "a1b2c3d4-e5f6-...",
"timestamp": "2026-04-22T14:30:00Z",
"stats": {
"total": 4812,
"valid": 3901,
"invalid": 911
}
}
Webhooks include an X-BounceZero-Signature header for HMAC-SHA256 verification using your webhook signing secret.
Sandbox Mode
Test your integration without consuming credits. Grab a sandbox key instantly below, or generate one from Dashboard > Settings > API Keys > Create Sandbox Key.
Try it instantly — no account needed
Get a temporary sandbox key in one click. It only supports POST /api/v1/verify, returns mock results, never consumes credits, and expires in 24 hours.
Shown once — copy it now. Sandbox keys return mock results only.
Test Addresses
| Returns | |
|---|---|
| [email protected] | valid (score 98) |
| [email protected] | invalid (score 2) |
| [email protected] | valid + catch_all_unresolved (score 50) |
| [email protected] | invalid + refunded (score 50) |
Sandbox keys are rate-limited to 30 requests per minute. The local part selects the result; also try disposable@ and risky@.
Code Examples
curl -X POST "https://api.bouncezero.io/api/v1/verify" \
-H "X-API-Key: bz_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]"}'
import requests
API_KEY = "bz_live_your_key_here"
response = requests.post(
"https://api.bouncezero.io/api/v1/verify",
json={"email": "[email protected]"},
headers={"X-API-Key": API_KEY},
)
data = response.json()
print(f"Result: {data['classification']}, Score: {data['score']}")
const API_KEY = "bz_live_your_key_here";
const res = await fetch("https://api.bouncezero.io/api/v1/verify", {
method: "POST",
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ email: "[email protected]" }),
});
const data = await res.json();
console.log(`Result: ${data.classification}, Score: ${data.score}`);
<?php
$apiKey = "bz_live_your_key_here";
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.bouncezero.io/api/v1/verify",
CURLOPT_HTTPHEADER => ["X-API-Key: $apiKey", "Content-Type: application/json"],
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["email" => "[email protected]"]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => "MyApp/1.0",
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo "Result: {$data['classification']}, Score: {$data['score']}";