API Documentation

All endpoints require an X-API-Key header with a valid API key. Keys are managed at /admin/api-keys.

POST /api/v1/validate/single — Validate a single email address

Request

POST /api/v1/validate/single
X-API-Key: <your-key>
Content-Type: application/json

{
  "email": "user@example.com",
  "company_id": 1,
  "force_revalidate": false
}
FieldRequiredDescription
emailYesThe email address to validate
company_idNoCompany to bill against. Defaults to the key's primary company. Required if the key is assigned to multiple companies.
force_revalidateNotrue to skip the cache and always call the validator, even if a fresh result exists. Default: false

Response

{
  "email": "user@example.com",
  "status": "Valid",
  "raw_status": "ok",
  "source": "elv",
  "cached": true,
  "date_last_validated": "2025-06-01T12:34:56"
}
FieldTypeDescription
emailstringThe email that was checked
statusstringValid, Invalid, or Greylist
raw_statusstringThe raw status code returned by the validator
sourcestringValidation provider used (elv, custom, …)
cachedbooleantrue if result was served from the local DB cache
date_last_validatedstring (ISO 8601)When the email was last validated against the provider
GET /api/v1/companies — List companies accessible by this API key

Returns the companies your API key is authorized for. Use the id as company_id in other requests.

Request

GET /api/v1/companies
X-API-Key: <your-key>

Response

[
  {"id": 1, "name": "Acme Corp", "slug": "acme-corp"},
  {"id": 3, "name": "Beta Ltd",  "slug": "beta-ltd"}
]
POST /api/v1/validate/file — Upload a CSV for bulk validation

Upload a CSV file with an email column (header must be exactly email). The endpoint returns a job_id immediately; processing runs in the background.

Request — multipart/form-data

POST /api/v1/validate/file?company_id=1&force_revalidate=false
X-API-Key: <your-key>
Content-Type: multipart/form-data

file=@emails.csv   (field name must be "file")
Query paramRequiredDescription
company_idNoCompany to bill against. Defaults to the key's primary company. Required if the key is assigned to multiple companies.
force_revalidateNotrue to skip cache for all emails in the file. Default: false

Example CSV

email
alice@example.com
bob@example.com
charlie@example.com

Response

{
  "job_id": 42,
  "status": "Processing",
  "total": 3
}
GET /api/v1/jobs/{job_id} — Poll job progress

Poll this endpoint until status is Done or Error.

Request

GET /api/v1/jobs/42
X-API-Key: <your-key>

Response — in progress

{
  "job_id": 42,
  "status": "Processing",
  "progress": 65,
  "total": 1000,
  "processed": 650
}

Response — complete

{
  "job_id": 42,
  "status": "Done",
  "progress": 100,
  "total": 1000,
  "processed": 1000
}
Status valueMeaning
PendingJob queued, not started yet
ProcessingCurrently being validated
DoneComplete — download results with the endpoint below
ErrorJob failed — check error_message field
GET /api/v1/reports/summary — Billing & validation summary for a date range

Returns billing volumes and validation outcome counts for a given period. Available to all API keys — results are automatically scoped to your company. Admin keys additionally receive a full billing breakdown and can query any company via company_id.

Request

GET /api/v1/reports/summary?start_date=2026-03-01&end_date=2026-03-31
X-API-Key: <your-key>
Query paramTypeDescription
start_dateYYYY-MM-DDStart of date range (inclusive)
end_dateYYYY-MM-DDEnd of date range (inclusive)
company_idintAdmin keys only — filter by a specific company. Ignored for standard keys.

Response — standard key

{
  "billed":   2051840,
  "valid":    1894230,
  "invalid":  142518,
  "greylist": 15092
}
FieldDescription
billedTotal emails charged for the period
validContacts with validation outcome Valid
invalidContacts with validation outcome Invalid
greylistContacts with validation outcome Greylist

Response — admin key (full breakdown)

{
  "billed":            2051840,
  "last_called_count": 2051840,
  "fresh_cleaned":     2051453,
  "cross_cache":       387,
  "own_cache":         1517,
  "local_rejections":  133,
  "valid":             1894230,
  "invalid":           142518,
  "greylist":          15092
}
FieldDescription
billedTotal charged = fresh_cleaned + cross_cache
last_called_countAlias for billed (kept for backwards compatibility)
fresh_cleanedEmails sent to the external validator (billed)
cross_cacheCache hits from another company's prior validation (billed)
own_cacheCache hits from your own prior validations (free)
local_rejectionsRejected locally by syntax error or missing MX record (free)
validContacts with validation outcome Valid
invalidContacts with validation outcome Invalid
greylistContacts with validation outcome Greylist
GET /api/v1/contacts — Paginated list of validated contacts

Returns validated contacts for your company, paginated. Supports date filtering, free-text search, and sorting. Available to all API keys — results are automatically scoped to your company. Admin keys can additionally filter by any company via company_id.

Request

GET /api/v1/contacts?start_date=2026-03-01&end_date=2026-03-31&limit=1000&offset=0
X-API-Key: <your-key>
ParamTypeDefaultDescription
start_dateYYYY-MM-DDFilter by last_called start date
end_dateYYYY-MM-DDFilter by last_called end date (inclusive)
searchstringFree-text search on email address, status, or domain
order_bystringidid, email, status, domain, mx_records, date_last_validated, last_called
order_dirasc / descdescSort direction
offsetint0Number of records to skip (for pagination)
limitint50Records per page — maximum 1000
company_idintAdmin keys only. Ignored for standard keys.

Response

{
  "draw": 1,
  "recordsTotal": 2492784,
  "recordsFiltered": 2099431,
  "data": [
    {
      "id": 10779707,
      "email": "user@example.com",
      "status": "Valid",
      "domain": "example.com",
      "mx_records": "mx1.example.com",
      "date_last_validated": "2026-03-31 07:01:25",
      "last_called": "2026-03-31 07:01:25"
    }
  ]
}
FieldDescription
recordsTotalTotal contacts stored for this company (no date filter applied)
recordsFilteredContacts matching the current filters
dataArray of contacts for this page
statusValid, Invalid, or Greylist

Paginating through all contacts: increment offset by limit on each request until the returned data array is empty or shorter than limit.

GET /api/v1/jobs/{job_id}/download — Download result CSV

Returns a CSV file once the job status is Done.

Request

GET /api/v1/jobs/42/download
X-API-Key: <your-key>

Responsetext/csv

email,status
alice@example.com,Valid
bob@example.com,Invalid
charlie@example.com,Greylist

The status column contains Valid, Invalid, or Greylist.

cURL Examples

List companies

curl -s https://verify.sendability.com/api/v1/companies \
  -H "X-API-Key: YOUR_KEY"

Single email

curl -s -X POST https://verify.sendability.com/api/v1/validate/single \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "test@example.com", "company_id": 1}'

Single email — force revalidate (skip cache)

curl -s -X POST https://verify.sendability.com/api/v1/validate/single \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "test@example.com", "company_id": 1, "force_revalidate": true}'

Bulk file upload

curl -s -X POST "https://verify.sendability.com/api/v1/validate/file?company_id=1" \
  -H "X-API-Key: YOUR_KEY" \
  -F "file=@emails.csv"

Poll until done & download

# Poll status
curl -s https://verify.sendability.com/api/v1/jobs/42 \
  -H "X-API-Key: YOUR_KEY"

# Download results (once status=Done)
curl -s https://verify.sendability.com/api/v1/jobs/42/download \
  -H "X-API-Key: YOUR_KEY" -o results.csv

Billing summary for March

curl -s "https://verify.sendability.com/api/v1/reports/summary?start_date=2026-03-01&end_date=2026-03-31" \
  -H "X-API-Key: YOUR_KEY"

Retrieve all contacts for March (paginated)

# Page 1
curl -s "https://verify.sendability.com/api/v1/contacts?start_date=2026-03-01&end_date=2026-03-31&limit=1000&offset=0" \
  -H "X-API-Key: YOUR_KEY"

# Page 2
curl -s "https://verify.sendability.com/api/v1/contacts?start_date=2026-03-01&end_date=2026-03-31&limit=1000&offset=1000" \
  -H "X-API-Key: YOUR_KEY"

# Keep incrementing offset by 1000 until data array is empty

Search for a specific email

curl -s "https://verify.sendability.com/api/v1/contacts?search=user@example.com" \
  -H "X-API-Key: YOUR_KEY"