REST API · v1.0

Build clean email data
into anything.

A small, predictable API for single checks and queued bulk verification. Start with 50 free checks every month.

Overview

The API base URL is:

https://emailverifier.g2v.org/api

Requests and responses use JSON unless you are uploading or downloading a file. All timestamps are ISO 8601 in UTC. API responses include X-API-Version: 1.0 and are never cached.

Stable three-state contractA successful POST /api returns exactly one client-facing status: safe, catch_all, or unsafe. The value is available at both status and data.status for integration compatibility. Detailed mailbox signals are isolated behind the authenticated status_url.

Authentication

Create a named key in your dashboard and send it as a Bearer token. The full secret is shown only once.

Authorization: Bearer g2v_ev_live_YOUR_KEY
Keep keys server-side.Do not expose a secret key in browser JavaScript, mobile binaries, public repositories, or URLs. Revoke a compromised key immediately.

Limits & credits

  • 50 free verification credits per UTC calendar month
  • Purchased pay-as-you-go credits remain valid for 365 days
  • Free monthly credits are used before purchased credits
  • One credit per address, whether the result is valid, risky, or invalid
  • Technical verifier or platform failures are automatically refunded
  • 25 authenticated API requests per minute per key
  • Up to 1,000 unique addresses per API token in each bulk job, subject to available credits
  • API result rows remain retrievable for 24 hours after completion

View pay-as-you-go credit packages.

POST/api

Verify one address

Submit one email string. Every successful response uses only safe, catch_all, or unsafe. Malformed, invalid, disposable, greylisted, and inconclusive addresses all normalize to unsafe on this base endpoint.

cURL

curl -X POST https://emailverifier.g2v.org/api \
  -H "Authorization: Bearer g2v_ev_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"hello@example.com"}'

Node.js

const response = await fetch("https://emailverifier.g2v.org/api", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.G2V_API_KEY,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ email: "hello@example.com" })
});

const result = await response.json();

200 response · safe

{
  "request_id": "f3d8...",
  "status": "safe",
  "data": {
    "email": "hello@example.com",
    "status": "safe"
  },
  "status_url": "/api/status/f3d8...",
  "credits": {
    "charged": 1,
    "limit": 50,
    "used": 1,
    "remaining": 49,
    "resets_at": "2026-09-01T00:00:00.000Z"
  }
}

200 response · catch_all

{
  "request_id": "a91c...",
  "status": "catch_all",
  "data": {
    "email": "sales@example.com",
    "status": "catch_all"
  },
  "status_url": "/api/status/a91c..."
}

200 response · unsafe

{
  "request_id": "b72e...",
  "status": "unsafe",
  "data": {
    "email": "missing@example.com",
    "status": "unsafe"
  },
  "status_url": "/api/status/b72e..."
}
GET/api/status/{request_id}

Get detailed verification status

Use the status_url returned by the base endpoint when your system needs the exact mailbox classification, risk flags, diagnosis, and check time. Authentication uses the same Bearer API key, and an account can access only its own requests. Retrieve details within 24 hours; after that the submitted address is redacted and this endpoint returns 410 details_expired.

curl https://emailverifier.g2v.org/api/status/REQUEST_ID \
  -H "Authorization: Bearer g2v_ev_live_YOUR_KEY"
{
  "request_id": "f3d8...",
  "state": "completed",
  "data": {
    "email": "hello@example.com",
    "status": "valid",
    "verdict": "safe",
    "safe_to_send": true,
    "disposable": false,
    "role_based": false,
    "free_provider": false,
    "catch_all": false,
    "greylisted": false,
    "diagnosis": "Mailbox exists and is active. Safe to send.",
    "checked_at": "2026-08-11T12:00:00.000Z"
  }
}
GET/api/bulk/template

Download the CSV template

This public endpoint downloads a ready-to-complete UTF-8 CSV file. Keep the first-row header exactly email, then add one email address per row beneath it. Do not put multiple addresses in one cell.

Download CSV template

cURL

curl -L https://emailverifier.g2v.org/api/bulk/template \
  -o g2v-email-verifier-template.csv
Required structureThe first column is named email. Blank rows and duplicate addresses are ignored; each unique accepted address reserves one verification credit.
POST/api/bulk

Create a bulk job

Send up to 1,000 unique addresses per API token in one JSON request or CSV/TXT upload. Duplicate addresses are removed before quota is reserved, and the account must have enough available credits. Processing is asynchronous.

JSON list

curl -X POST https://emailverifier.g2v.org/api/bulk \
  -H "Authorization: Bearer g2v_ev_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filename":"leads.csv","emails":["one@example.com","two@example.com"]}'

File upload

curl -X POST https://emailverifier.g2v.org/api/bulk \
  -H "Authorization: Bearer g2v_ev_live_YOUR_KEY" \
  -F "file=@./contacts.csv"

202 response

{
  "job_id": "cb71...",
  "status": "queued",
  "total": 2,
  "status_url": "/api/bulk/cb71..."
}
GET/api/bulk/{job_id}

Get job status and results

Poll this endpoint until status is COMPLETED or PARTIAL. The response includes progress, aggregate counts, and ordered result rows. Download or import the rows within 24 hours after completion. G2V then redacts submitted addresses and the client-supplied filename while preserving aggregate operational logs; an expired CSV download returns HTTP 410.

curl https://emailverifier.g2v.org/api/bulk/JOB_ID \
  -H "Authorization: Bearer g2v_ev_live_YOUR_KEY"

Download the same results as CSV from /api/bulk/{job_id}/download.

GET/api/usage

Get monthly usage

curl https://emailverifier.g2v.org/api/usage \
  -H "Authorization: Bearer g2v_ev_live_YOUR_KEY"

Detailed status reference

These five internal mailbox statuses appear only in the detailed endpoint, bulk results, and dashboard. The base POST /api remains limited to safe, catch_all, or unsafe.

validsafeThe G2V in-house verifier confirmed that the receiving mail server accepts this mailbox.
catch_allcatch_allThe receiving domain accepts mail for the requested address and also accepts an unpredictable test recipient.
invalidunsafeThe syntax is malformed, the domain does not accept mail, or the receiving server reports that the mailbox does not exist.
greylistedunsafeThe receiving server temporarily deferred verification. Retry later before treating the address as deliverable.
unknownunsafeThe receiving mail infrastructure did not provide a reliable determination.
Safety override orderdisposable: true or greylisted: true maps any base response to unsafe. Role-based and free-provider signals remain informational and do not, by themselves, make an address unsafe.

Verdicts and safety fields

safe

Status is valid or catch_all, and neither disposable nor greylisted is true. safe_to_send is true.

risky

The address is disposable or greylisted. safe_to_send is false.

undeliverable

Invalid format or a mailbox diagnosed as invalid. safe_to_send is false.

unknown

The in-house verifier could not make a reliable determination. safe_to_send is false.

Important: a catch-all domain accepts messages sent to arbitrary recipients, so the individual mailbox may still be absent. Verification reduces risk but cannot guarantee delivery, engagement, consent, identity, or future availability.

Error format

{
  "error": {
    "code": "verification_credits_exhausted",
    "message": "No verification credits are currently available for this account."
  }
}
400Malformed JSON or bulk input
401Missing, revoked, or invalid API key
413Request or file is too large
415Unsupported content type
422A required field is missing
429Rate limit or monthly quota reached
503Temporary in-house verifier capacity issue; no credit charged
Ready to make the first call?Your free key is two minutes away.
Create account