API Reference

Email Verifier API

v0.1.0

Professional email verification API. ## Authentication Every request must carry your API key in the **`Api-Key`** header (never `Authorization: Bearer`). Keys are prefixed with `ev_`. ``` Api-Key: ev_live_xxxxxxxxxxxxxxxxxxxxxxxx ``` ## Rate limiting Limits are enforced **per key**. Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (Unix epoch). On `429` a `Retry-After` header (seconds) is also returned. ## Billing & quota One verification = one credit. Results categorised as `unknown` are **never** billed; in bulk, the unit is distinct addresses after de-duplication. The monthly quota is a **soft cap** by default (usage is measured and you are alerted, but requests are never blocked). When a client is configured with `hard_cap=true`, exhausting the quota returns `402 QUOTA_EXCEEDED`. Track your own consumption via `GET /usage`. ## Error format Errors return an HTTP status and a JSON body of the shape: ```json { "detail": { "error": "Human-readable message.", "code": "MACHINE_CODE" } } ``` Always branch on the stable `code`, not on the message text.

GET /api/v1/health

Health Check

Responses
StatusDescription
200 Successful Response
object
GET /api/v1/

Root

Responses
StatusDescription
200 Successful Response
any
GET /api/v1/stats/disposable

Disposable Stats

Return stats about disposable domain detection.

Responses
StatusDescription
200 Successful Response
any
GET /api/v1/stats/free-providers

Free Provider Stats

Return stats about free email provider detection.

Responses
StatusDescription
200 Successful Response
any
GET /api/v1/stats/internal-cache

Internal Cache Stats

Return stats about the internal cache (hard bounces, high-risk emails).

Responses
StatusDescription
200 Successful Response
any
GET /api/v1/stats/verification-history

Verification History Stats

Return stats about the verification history table (Phase 3.1). This is the global, client-agnostic store of stable verdicts (undeliverable/disposable/high_risk) with 5-year retention.

Responses
StatusDescription
200 Successful Response
any
POST /api/v1/verify

Verify Single Email

Request Body *

application/json

FieldTypeDescriptionDefault
email * string
options object | null
Responses
StatusDescription
200 Successful Response
object
401 Missing, invalid, revoked or expired API key. Codes: MISSING_API_KEY, INVALID_API_KEY, KEY_REVOKED, KEY_EXPIRED.
402 Monthly quota exhausted (only when the client has hard_cap=true).
403 API key lacks the required scope, or the client account is inactive. Codes: INSUFFICIENT_SCOPE, CLIENT_INACTIVE.
422 Validation Error
object
429 Per-key rate limit exceeded.
POST /api/v1/verify/batch

Verify Batch Emails

Enqueue a batch of emails (up to 1000) for asynchronous verification. Returns a 202 with a `job_id` the client can poll via `GET /jobs/{id}`.

Request Body *

application/json

FieldTypeDescriptionDefault
emails * array[string]
options object | null
webhook_url string | null HTTPS URL to notify when the job completes.
retention_days integer Number of days the result CSV is kept available for download. Must be between 1 and 30. The retention period must be between 1 and 30 days. 1
Responses
StatusDescription
202 Successful Response
object
400 Invalid request. Codes: BATCH_TOO_LARGE, INVALID_RETENTION_DAYS.
401 Missing, invalid, revoked or expired API key. Codes: MISSING_API_KEY, INVALID_API_KEY, KEY_REVOKED, KEY_EXPIRED.
403 API key lacks the required scope, or the client account is inactive. Codes: INSUFFICIENT_SCOPE, CLIENT_INACTIVE.
422 Validation Error
object
429 Per-key rate limit exceeded.
POST /api/v1/verify/csv

Verify Csv Upload

Upload a CSV file (up to 100 000 rows) for asynchronous batch verification. Auto-detects encoding (UTF-8/UTF-8-BOM/CP1252/Latin-1), delimiter (`,;\t|`), header presence, and the email column. Extra columns are preserved in the output CSV.

Request Body *

multipart/form-data

FieldTypeDescriptionDefault
file * string CSV file. Max size: csv_max_file_size_mb, max rows: csv_max_rows.
webhook_url string | null HTTPS URL to notify when the job completes.
retention_days integer Days the result CSV is kept (1–30, default 1). 1
check_smtp boolean true
suggest_typo boolean true
check_random boolean true
check_domain_trust boolean false
Responses
StatusDescription
202 Successful Response
object
400 Invalid file/content. Codes: INVALID_RETENTION_DAYS, EMPTY_FILE, CSV_PARSE_ERROR, EMPTY_CSV, TOO_MANY_ROWS, UPLOAD_FAILED.
401 Missing, invalid, revoked or expired API key. Codes: MISSING_API_KEY, INVALID_API_KEY, KEY_REVOKED, KEY_EXPIRED.
403 API key lacks the required scope, or the client account is inactive. Codes: INSUFFICIENT_SCOPE, CLIENT_INACTIVE.
413 Uploaded CSV exceeds the maximum allowed size.
422 Validation Error
object
429 Per-key rate limit exceeded.
GET /api/v1/jobs

List Jobs

List verification jobs (most recent first). Currently returns all jobs in the system (admin view). Phase 5 will add per-client filtering based on the authenticated client_id.

Parameters
NameInTypeDescription
status query string | null Filter by status: pending, processing, completed, failed, cancelled
created_after query string | null ISO 8601 timestamp - only jobs created after this date
created_before query string | null ISO 8601 timestamp - only jobs created before this date
limit query integer
offset query integer
Responses
StatusDescription
200 Successful Response
object
400 Invalid query filter. Codes: INVALID_STATUS_FILTER, INVALID_DATE_FORMAT.
401 Missing, invalid, revoked or expired API key. Codes: MISSING_API_KEY, INVALID_API_KEY, KEY_REVOKED, KEY_EXPIRED.
403 API key lacks the required scope, or the client account is inactive. Codes: INSUFFICIENT_SCOPE, CLIENT_INACTIVE.
422 Validation Error
object
GET /api/v1/jobs/{job_id}

Get Job Status

Fetch the status and stats of a verification job.

Parameters
NameInTypeDescription
job_id * path string
Responses
StatusDescription
200 Successful Response
object
400 Malformed job_id.
401 Missing, invalid, revoked or expired API key. Codes: MISSING_API_KEY, INVALID_API_KEY, KEY_REVOKED, KEY_EXPIRED.
403 API key lacks the required scope, or the client account is inactive. Codes: INSUFFICIENT_SCOPE, CLIENT_INACTIVE.
404 No job with this id for the authenticated client.
422 Validation Error
object
GET /api/v1/jobs/{job_id}/results

Get Job Results

Get a paginated page of results for a completed (or in-progress) job.

Parameters
NameInTypeDescription
job_id * path string
offset query integer
limit query integer
category query string | null Filter by category: deliverable, undeliverable, risky, disposable, unknown, duplicate, invalid_syntax, random_pattern, high_risk, accept_all.
include_email query boolean If true, decrypt and include the email address in each row.
Responses
StatusDescription
200 Successful Response
object
400 Malformed job_id.
401 Missing, invalid, revoked or expired API key. Codes: MISSING_API_KEY, INVALID_API_KEY, KEY_REVOKED, KEY_EXPIRED.
403 API key lacks the required scope, or the client account is inactive. Codes: INSUFFICIENT_SCOPE, CLIENT_INACTIVE.
404 No job with this id for the authenticated client.
422 Validation Error
object
GET /api/v1/jobs/{job_id}/download

Download Job Result

Download the result CSV file for a completed job. Authentication is mandatory via the `Api-Key` header. Ownership is enforced by matching the job's `client_id`.

Parameters
NameInTypeDescription
job_id * path string
Responses
StatusDescription
200 Successful Response
any
400 Malformed job_id.
401 Missing, invalid, revoked or expired API key. Codes: MISSING_API_KEY, INVALID_API_KEY, KEY_REVOKED, KEY_EXPIRED.
403 API key lacks the required scope, or the client account is inactive. Codes: INSUFFICIENT_SCOPE, CLIENT_INACTIVE.
404 Job or result file not found. Codes: JOB_NOT_FOUND, RESULT_FILE_MISSING.
409 Job is not completed yet.
410 Result file expired (past its retention window).
422 Validation Error
object
GET /api/v1/usage

Read Usage

Parameters
NameInTypeDescription
period query string | null Month 'YYYY-MM' (default: current month).
Responses
StatusDescription
200 Successful Response
any
401 Missing, invalid, revoked or expired API key. Codes: MISSING_API_KEY, INVALID_API_KEY, KEY_REVOKED, KEY_EXPIRED.
403 API key lacks the required scope, or the client account is inactive. Codes: INSUFFICIENT_SCOPE, CLIENT_INACTIVE.
422 Validation Error
object