Developers
Email verification API for developers
One REST call tells you whether an address can receive mail, and why. Official SDKs, signed webhooks, sandbox keys and versioned responses.
- Typically under half a second
- Bulk jobs of up to 100,000 emails
- Node.js and Python SDKs, plus a CLI
- Sandbox keys that never use credits
$ curl -X POST https://api.rocketverifier.com/v1/verify \
-H "Authorization: Bearer $RV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "john@example.com"}'import RocketVerifier from '@rocketverifier/sdk';
const rv = new RocketVerifier(process.env.RV_API_KEY);
const result = await rv.verify('john@example.com');
switch (result.status) {
case 'deliverable': // safe to send
case 'risky': // check result.sub_status
case 'undeliverable': // remove from the list
case 'unknown': // retry later, never charged
}import os
from rocketverifier import RocketVerifier
rv = RocketVerifier(os.environ["RV_API_KEY"])
result = rv.verify("john@example.com")
if result.status == "deliverable":
# safe to send
...
elif result.status == "unknown":
# retry later, never charged
... Quickstart
Verify your first email in three steps
No SDK required. If you can send an HTTPS request, you can ship email verification today.
-
Create an API key
Open API keys in the dashboard and create a key. Live keys start with rv_live_, sandbox keys with rv_test_.
export RV_API_KEY="rv_live_..."Open API keys -
Call /v1/verify
POST the address as JSON with your key in the Authorization header. One verification uses 1 credit.
POST /v1/verify {"email": "john@example.com"}Quickstart guide -
Branch on status
Send to deliverable, review risky with its sub_status, drop undeliverable and retry unknown later at no cost.
status → deliverable | risky | undeliverable | unknownHow results work
The response
Every field you need to decide, in one call
Responses are plain JSON with stable field names. Branch on status, then use the detail fields to explain, score or correct each address.
- status
- deliverable, risky, undeliverable or unknown. The one field to branch on.
- sub_status
- The precise reason, such as mailbox_not_found, catch_all, role_based or greylisted.
- score
- Confidence from 0 to 100 for ranking and thresholds.
- catch_all_verdict
- send_safe, send_with_caution or avoid. Null unless the domain accepts all mail.
- did_you_mean
- A suggested correction when the domain looks like a typo, such as gmial.com.
- provider
- The mailbox provider behind the domain, for example google.com.
- verified_at
- When the result was produced, in ISO 8601 UTC.
{
"email": "john@example.com",
"status": "deliverable",
"sub_status": "none",
"reason": "accepted_email",
"score": 95,
"domain": {
"name": "example.com",
"acceptAll": "no",
"disposable": "no",
"free": "no"
},
"account": {
"role": "no",
"disabled": "no",
"fullMailbox": "unknown"
},
"dns": {
"type": "MX",
"record": "aspmx.l.google.com"
},
"provider": "google.com",
"authentication_score": 95,
"deliverability_tier": "excellent",
"toxic": "no",
"abuse": "no",
"spam_trap": "no",
"did_you_mean": null,
"catch_all_verdict": null,
"verified_at": "2026-10-15T12:00:00+00:00"
} Endpoints
A small, predictable REST API
All endpoints live under https://api.rocketverifier.com and authenticate with Authorization: Bearer and your API key.
| Method | Endpoint | What it does |
|---|---|---|
| POST | /v1/verify | Verify one address in real time. 1 credit; unknown results are free. |
| POST | /v1/verify/bulk | Submit a JSON list of up to 100,000 emails as one job. |
| POST | /v1/verify/bulk/upload | Upload a CSV, TSV, TXT or XLSX file up to 50 MB, or pass a source URL. Preview the columns, then confirm. |
| GET | /v1/jobs | List your bulk jobs, paginated, with an optional status filter. |
| GET | /v1/jobs/{id} | Job status and summary counts. |
| GET | /v1/jobs/{id}/progress | Live progress for a running job. |
| GET | /v1/jobs/{id}/results | Per-email results, paginated. |
| GET | /v1/jobs/{id}/download | Results as CSV. Add ?columns=zerobounce, bouncer or kickbox to export in that provider’s column layout. |
| DELETE | /v1/jobs/{id} | Cancel a pending or running job. Unprocessed emails are refunded. |
| GET | /v1/credits | Your current credit balance. |
| POST | /v1/webhooks | Register a webhook endpoint. List, update and delete endpoints on the same resource. |
| POST | /v1/monitors | Create a deliverability monitor for a saved list or a sending domain. |
| GET | /v1/tools/* | Free disposable, MX and domain authentication lookups. No credits used. |
SDKs and tools
Official SDKs for the way you build
Maintained clients with typed results, bulk job helpers and webhook signature verification built in.
-
Node.js
@rocketverifier/sdk
Typed client for Node.js with verify, bulk jobs, results and webhook signature helpers.
npm install @rocketverifier/sdkNode.js docs -
Python
rocketverifier
Sync and async clients with type hints, bulk jobs and webhook signature helpers.
pip install rocketverifierPython docs -
CLI
@rocketverifier/cli
Verify, run bulk jobs and download results from your terminal or CI, with --json output.
npm install -g @rocketverifier/cliCLI docs -
MCP server
@rocketverifier/mcp
Let Claude, ChatGPT, Cursor and other MCP clients verify emails for you.
npx -y @rocketverifier/mcpMCP server docs
Webhooks
Signed webhooks instead of polling
Subscribe an HTTPS endpoint to the events you care about. Every delivery is signed so you can trust it, and retried if your endpoint is down.
-
job.completedA bulk job finished, with summary counts and a download URL. -
job.failedA bulk job could not be completed. -
email.verifiedEach single verification, with the same fields the API returns. -
credits.lowYour balance dropped below 100 credits. -
credits.depletedYour balance reached zero. -
monitor.alertA deliverability monitor detected a regression.
Each request carries an X-RocketVerifier-Signature: t=<unix>,v1=<hex> header: an HMAC-SHA256 of the timestamp, a dot and the raw body, keyed with your endpoint secret. Reject deliveries older than five minutes and de-duplicate on the stable event_id.
import express from 'express';
import { verifyWebhookSignature } from '@rocketverifier/sdk';
app.post('/webhooks/rocketverifier', express.raw({ type: 'application/json' }), (req, res) => {
const ok = verifyWebhookSignature(
req.body,
req.get('X-RocketVerifier-Signature'),
process.env.RV_WEBHOOK_SECRET,
);
if (!ok) return res.sendStatus(400);
const event = JSON.parse(req.body);
// de-duplicate on event.event_id, then handle event.event
res.sendStatus(200);
});import os
from flask import Flask, request, abort
from rocketverifier import verify_webhook_signature
app = Flask(__name__)
@app.post("/webhooks/rocketverifier")
def rocketverifier_webhook():
if not verify_webhook_signature(
request.get_data(),
request.headers.get("X-RocketVerifier-Signature"),
os.environ["RV_WEBHOOK_SECRET"],
):
abort(400)
event = request.get_json()
# de-duplicate on event["event_id"], then handle event["event"]
return "", 200{
"event_id": "6f1c2a8e-5d4b-4f7a-9c3e-2b1a0d9e8f7c",
"event": "job.completed",
"timestamp": "2026-10-15T12:04:31+00:00",
"data": {
"job_id": "kZ3vQ9xLp2Rm8TnW4yBc1A",
"status": "completed",
"name": "October leads",
"total_emails": 10000,
"processed_emails": 10000,
"valid_count": 8512,
"invalid_count": 1187,
"risky_count": 151,
"catch_all_count": 98,
"disposable_count": 52,
"created_at": "2026-10-15T11:58:02+00:00",
"completed_at": "2026-10-15T12:04:31+00:00",
"download_url": "https://api.rocketverifier.com/v1/jobs/kZ3vQ9xLp2Rm8TnW4yBc1A/download"
}
} Production ready
Built for safe, predictable integrations
Test for free, pin behaviour, handle limits and errors cleanly, and lock each key down to exactly what it needs.
-
Sandbox keys
Build and test without spending credits. Sandbox keys (rv_test_) return deterministic results for addresses at @sandbox.rocketverifier.com.
deliverable@ undeliverable@ risky@ disposable@ unknown@ sandbox.rocketverifier.com
Authentication docs -
Versioned responses
Pin how results map to statuses with a header. 2026-11-01 reports catch-all addresses as risky; 2025-01-01 keeps them as unknown.
RocketVerifier-Version: 2026-11-01
API reference -
Rate limits
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Over the limit you get a 429 with Retry-After.
HTTP/1.1 429 rate_limited Retry-After: 12
Rate limit docs -
Predictable errors
Errors share one JSON shape with a stable code, a message and details, so you can handle each case in code.
{"error": {"code": "ip_not_allowed", "message": "...", "details": null}}Error reference -
Safe retries
Send an Idempotency-Key header on /v1/verify and /v1/verify/bulk. A retried request returns the original result instead of charging twice.
Idempotency-Key: 7b1e4c0a-signup-42
API reference -
Key controls
Give each key an expiry date, a monthly credit spend cap and an IP allowlist. Organization keys can draw on pooled team credits.
401 api_key_expired 402 api_key_spend_cap_reached 403 ip_not_allowed
Authentication docs
Resources
Everything you need to ship
- Quickstart From API key to first verification.
- API reference Every endpoint, parameter and field.
- Authentication Keys, sandbox mode and key controls.
- SDKs Node.js, Python, CLI and MCP.
- Webhooks Events, payloads and signatures.
- Errors Every error code and how to handle it.
- Rate limits Limits, headers and backoff.
- Recipes Copy-paste guides for common stacks.
- Changelog New features and API changes.
- MCP server Verify emails from AI assistants.
- Integration docs CRMs, email platforms and automation.
- System status Live API and dashboard availability.
FAQ
Developer questions, answered
How do I get an API key?
Open API keys in the dashboard and create a key. Create an account and claim 100 free verification credits with your work email. No credit card required. You can also create a sandbox key to test without spending credits.
How fast is the verification API?
Typically under half a second. When a live SMTP check is needed, a result typically takes 1 to 3 seconds. For large lists, use a bulk job of up to 100,000 emails and get a job.completed webhook when it finishes.
Which SDKs are available?
Official SDKs for Node.js (@rocketverifier/sdk) and Python (rocketverifier), a CLI (@rocketverifier/cli) and an MCP server (@rocketverifier/mcp). Any language that can send an HTTPS request can call the REST API directly.
How are API calls billed?
Each verification uses 1 credit. Unknown results are never charged, duplicates in a bulk list are removed before billing, and sandbox keys never use credits. The free disposable, MX and domain authentication lookups do not use credits either.
Will future API changes break my integration?
No. Changes are additive, and the RocketVerifier-Version header lets you pin how results map to statuses. Every change is listed in the changelog.
Ship email verification this afternoon
Create a key, call /v1/verify and branch on the result. Unknown results are always free.
100 free credits · No card required · Credits never expire