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/[email protected]
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| string | Email address to verify (required) | |
| depth | string | Verification depth: basic, standard (default), deep, ultra |
Example Response
{
"email": "[email protected]",
"result": "valid",
"score": 95,
"smtp_check": true,
"mx_check": true,
"disposable": false,
"free_provider": true,
"catch_all": false,
"reason": "Mailbox exists and is deliverable"
}
Bulk Verification
Upload a CSV file of emails for batch verification. Three endpoints are used in sequence.
1. Upload CSV
/api/v1/bulk/upload
Send a multipart/form-data request with a CSV 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": "processing"
}
2. Check Status
/api/v1/bulk/{job_id}/status
{
"job_id": "a1b2c3d4-e5f6-...",
"status": "processing",
"total": 4812,
"completed": 3200,
"progress_pct": 66.5
}
3. Get Results
/api/v1/bulk/{job_id}/results
Returns results once status is completed. Supports ?format=csv or ?format=json (default).
Response Fields
| Field | Type | Description |
|---|---|---|
| result | string | Verification result: valid or invalid |
| score | integer | Deliverability score from 0 to 100 |
| smtp_check | boolean | Whether the mailbox responded to SMTP RCPT TO probe |
| mx_check | boolean | Whether the domain has valid MX records |
| disposable | boolean | Whether the email uses a disposable/temporary domain |
| free_provider | boolean | Whether the domain is a free email provider (Gmail, Yahoo, etc.) |
| catch_all | boolean | Whether the domain accepts all email addresses |
| reason | 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 |
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. Generate a sandbox key from Dashboard > Settings > API Keys > Create Sandbox Key.
Test Addresses
| Returns | |
|---|---|
| [email protected] | valid (score 95) |
| [email protected] | invalid (score 5) |
| [email protected] | valid + catch_all_unresolved (score 65) |
Sandbox keys are rate-limited to 10 requests per minute.
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['result']}, 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.result}, 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,
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo "Result: {$data['result']}, Score: {$data['score']}";