cURL
curl -X POST https://mailthentic.com/api/verify/single \
-H "Authorization: Bearer mt_your_key" \
-H "Content-Type: application/json" \
-d '{"email":"person@example.com"}'Asynchronous REST API
Create a single-address job or upload a CSV or XLSX file, then poll the returned status and results URLs. API-key calls require paid status and the appropriate key scopes.
Send Authorization: Bearer mt_your_key. X-API-Key: mt_your_key is also accepted. Keys are stored as hashes and can be scoped with verify:write and verify:read.
| Method | Path | Purpose |
|---|---|---|
| GET | /api/me | Test the key and identify the account. |
| POST | /api/verify/single | Create a one-address job from JSON. |
| POST | /api/verify/bulk | Create a job from multipart CSV or XLSX. |
| GET | /api/jobs/{job_id}/status | Poll state, progress, and counts. |
| GET | /api/jobs/{job_id}/results?page=1 | Read paginated result objects. |
A successful submission returns HTTP 202, not a final verdict. Store the job ID and poll the URLs in the response.
curl -X POST https://mailthentic.com/api/verify/single \
-H "Authorization: Bearer mt_your_key" \
-H "Content-Type: application/json" \
-d '{"email":"person@example.com"}'const response = await fetch(
"https://mailthentic.com/api/verify/single",
{
method: "POST",
headers: {
Authorization: "Bearer mt_your_key",
"Content-Type": "application/json",
},
body: JSON.stringify({ email: "person@example.com" }),
signal: AbortSignal.timeout(10000),
},
);
if (!response.ok) throw new Error(await response.text());
const job = await response.json();import requests
response = requests.post(
"https://mailthentic.com/api/verify/single",
headers={"Authorization": "Bearer mt_your_key"},
json={"email": "person@example.com"},
timeout=10,
)
response.raise_for_status()
job = response.json()$ch = curl_init(
"https://mailthentic.com/api/verify/single"
);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer mt_your_key",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"email" => "person@example.com"
]),
]);
$body = curl_exec($ch);{
"job_id": "uuid",
"status_url": "/api/jobs/uuid/status",
"results_url": "/api/jobs/uuid/results"
}
Submit multipart form data with a file field. Supported formats are CSV and XLSX. Account credits, concurrency, and tier-specific job limits apply.
curl -X POST https://mailthentic.com/api/verify/bulk \
-H "Authorization: Bearer mt_your_key" \
-F "file=@contacts.csv"
This is a file endpoint, not a JSON array batch endpoint. The response includes job_id, total_items, status_url, and results_url.
status_url with increasing intervals until state is done or failed.The public contract does not define a fixed requests-per-second number. Do not build against an invented limit. Respect returned 429 responses and the plan-aware bulk concurrency rules.
The result object includes the stored status, reason, confidence score and optional breakdown, syntax and DNS fields, MX provider and hosts, SMTP signals, catch-all, flags, and SPF, DKIM, and DMARC context.
| Bucket | Examples | Integration action |
|---|---|---|
| Valid | deliverable_confirmed, deliverable_unconfirmed | Inspect confirmation detail for ambiguous providers. |
| Risky | Catch-all or missing authentication statuses | Route to a documented review policy. |
| Invalid | Syntax, domain, no MX, disposable, or permanent rejection | Reject or correct the source record. |
| Unknown | Temporary DNS or SMTP uncertainty | Retry later or use email confirmation. |
Treat unknown as unresolved, not invalid. A confidence score is not a promise of inbox placement. The verification status guide maps each bucket and stored status to a practical application decision.
Use the API at signup, checkout, import, or another product boundary. Use the web bulk verifier for an existing file that an operator needs to review. The decision guide covers hybrid workflows.