Skip to content

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.

  1. 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
  2. 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
  3. 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 | unknown How 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.
Response 200 OK · application/json
{
  "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.

RocketVerifier API endpoints
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/sdk Node.js docs
  • Python

    rocketverifier

    Sync and async clients with type hints, bulk jobs and webhook signature helpers.

    pip install rocketverifier Python docs
  • CLI

    @rocketverifier/cli

    Verify, run bulk jobs and download results from your terminal or CI, with --json output.

    npm install -g @rocketverifier/cli CLI docs
  • MCP server

    @rocketverifier/mcp

    Let Claude, ChatGPT, Cursor and other MCP clients verify emails for you.

    npx -y @rocketverifier/mcp MCP 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.completed A bulk job finished, with summary counts and a download URL.
  • job.failed A bulk job could not be completed.
  • email.verified Each single verification, with the same fields the API returns.
  • credits.low Your balance dropped below 100 credits.
  • credits.depleted Your balance reached zero.
  • monitor.alert A 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.

Webhook docs
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

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