Everything you need to integrate single checks and bulk jobs into your stack. Authenticate with a single header, ship in minutes.
Send your key in the X-API-Key header for server-to-server verification requests. Generate a key from your dashboard.
Start with a single verify call, then move into keys, jobs, and parsed result rows as soon as you need scale. The examples below match the current route surface.
Single verify returns the classification, numeric score, boolean checks, and enrichment fields used by the dashboard. Omitting mode gives you exactly this, at one credit.
A deep response is the same document plus an smtp object holding what the recipient mail server said about the mailbox. Nothing is renamed or removed.
Use the parsed result endpoint to drive in-app filtering and dashboards without downloading the whole CSV first.
Every verification endpoint takes an optional mode. Omitting it means fast, so existing integrations are unchanged: same latency, same one-credit cost, same response fields. Standard verification is quick. Deep verification takes longer, because MailSift opens a connection to the recipient mail server and waits for its replies, and that server's speed is outside our control. We do not promise an exact completion time for it.
The default engine, unchanged. Everything MailSift can learn without contacting the recipient mail server.
Syntax, normalization, domain and DNS, MX, disposable and temp-mail detection, relay and forwarder detection, role accounts, free providers, SPF, DMARC, typo suggestions, domain intelligence, domain age, local-part risk signals, catch-all detection, and the MailSift trust score.
Everything fast does, plus an SMTP conversation with the recipient mail server to check the mailbox itself.
Mailbox acceptance, recipient-specific rejection, catch-all resolution, greylisting detection, provider-specific interpretation, and STARTTLS. Deep responses carry an extra smtp object.
Optional everywhere. Enum fast or deep, default fast.
One shared balance covers both modes. There is no separate SMTP subscription.
Branch on sub_status instead of parsing the sentences in reasons. A check that did not run is left out of checks rather than reported as false, so false always means checked and clean.
Present on deep responses only. When no SMTP conversation ran, the object is { "checked": false, "status": "not_checked", "reason": "…" }.
Send an optional Idempotency-Key header on GET /api/v1/verify so a retry after a network blip cannot charge you twice or start a second SMTP conversation. Without the header, behavior is exactly as before.
Send mode=deep alongside the file and every row in the job gets a mailbox check. The job reserves 5 credits per row when it is created and refunds the unused remainder when it finishes.
Fields not relevant to the point being made are trimmed from these responses.
Fast responses never include an smtp object.
The domain has no MX record, so no mail can reach it.
The mail server accepted this recipient and its acceptance is trustworthy. Billed at the deep rate.
A recipient-specific permanent rejection. The mailbox does not exist.
The domain accepts every recipient, so acceptance proves nothing about this mailbox. Overall status is risky, not valid.
Yahoo accepted the recipient but does not confirm mailbox existence. MailSift reports that honestly instead of calling it deliverable. Still billed at the deep rate, because establishing that the domain accepts everything is a real finding.
The standard checks already settled the address, so no SMTP conversation ran and you pay the fast price.
The top-level status is the same field in both modes and combines every signal MailSift gathered. Deep verification feeds the mailbox result into it; it does not replace it.