Everything you need to integrate Mailcaff email verification and finder into your application.
All API requests require a Bearer token in the Authorization header.
You can generate API keys from the API Keys page.
Requests without a valid API key will receive a 401 Unauthorized response.
Verify the deliverability of a single email address. Returns reachability status, quality score, and detailed checks.
| Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | The email address to verify | |
| mode | string | No | power (default): full SMTP verification, 2–60s. quick: syntax + MX check only, sub-500ms. Quick mode does not contact the mail server. |
| Field | Type | Description |
|---|---|---|
| string | The email address that was verified | |
| status | string | Reachability result: valid, invalid, risky, unknown, disposable, or error |
| quality_score | integer | Composite quality score from 0–100 (higher is better) |
| is_valid | boolean | Whether the email is confirmed deliverable |
| is_deliverable | boolean | SMTP server accepted the recipient |
| is_disposable | boolean | Temporary/disposable email provider |
| is_role_account | boolean | Role-based address (e.g. info@, support@) |
| is_free_email | boolean | Free email provider (e.g. Gmail, Yahoo, Outlook) |
| can_connect_smtp | boolean | SMTP connection was successful |
| mx_accepts_mail | boolean | Domain has valid MX records |
| mode | string | Verification mode used: power or quick |
| is_spam_trap | boolean | Detected as a known spam trap address (only present when true) |
| response_ms | integer | Verification time in milliseconds |
| Value | Quality Score | Meaning |
|---|---|---|
| valid | 90–100 | Email exists and is deliverable |
| risky | 40–85 | Delivery uncertain. The domain may accept all emails, or SMTP signals are mixed. Score reflects confidence: 75+ is likely deliverable, below 50 is likely undeliverable |
| unknown | 40–45 | Could not determine reachability (server timeout, etc.) |
| disposable | 0–10 | Temporary/throwaway email address |
| invalid | 5–10 | Email does not exist or is not deliverable |
Submit up to 500 emails for background verification. Returns a job ID to poll for results.
Each object in results has the same fields as the single verify response.
Find a person's email address given their name and company domain. Tests common patterns against the mail server.
| Field | Type | Description |
|---|---|---|
| found | boolean | Whether a valid email was discovered |
| string|null | The discovered email address | |
| confidence | string|null | high (SMTP verified), medium (likely valid), or low (best guess on catch-all domain) |
| pattern | string|null | Pattern that matched (e.g. first.last, flast) |
| source | string|null | How the email was found: learned (SMTP verified), cache (cached result), mx_intel (MX provider intelligence), gravatar (Gravatar match), pattern_db (known domain pattern), scraped (website scrape) |
| reason | string|null | Explanation when not found: no_mx_records, disposable_domain, catchall_detected, no_pattern_matched |
| response_ms | integer | Search time in milliseconds |
| Value | Meaning |
|---|---|
| high | Email confirmed deliverable via SMTP verification |
| medium | Email likely valid based on domain pattern or catch-all with strong signals |
| low | Best statistical guess on a catch-all domain. The email format is likely correct but delivery cannot be verified |
Submit multiple leads for background email finding. Returns a job ID to poll for results.
Find the company domain from just a company name. Returns the domain with MX validation so you know it handles email. Pair with the Email Finder to go from company name to email address.
| Field | Type | Description |
|---|---|---|
| company_name | string | The company name that was searched |
| domain | string|null | Best matching domain found (null if none found) |
| has_mx | boolean | Whether the domain has MX records (accepts email) |
| has_website | boolean | Whether the domain has a live website |
| confidence | string | "high" (website + MX), "medium" (MX only), or "low" (website only) |
| candidates_checked | integer | Number of domain candidates tested |
| status | string | "found", "not_found", or "error" |
| response_ms | integer | Total processing time in milliseconds |
Costs 1 credit per lookup. Tries common TLDs (.com, .nl, .de, .io, .eu, .co, .net, .org) and validates with DNS + HTTP checks.
Configure a webhook URL to receive notifications when bulk jobs complete. Set your webhook URL in API Keys & Settings.
Events: bulk_job.completed and bulk_job.failed.
Webhooks are HTTPS-only and delivered with a 10-second timeout.
All errors return a JSON object with an error field.
| Status Code | Meaning |
|---|---|
| 400 | Bad request: missing or invalid parameters |
| 401 | Unauthorized: missing or invalid API key |
| 404 | Not found: job or resource doesn't exist |
| 429 | Rate limit exceeded: monthly credits exhausted |
| 500 | Server error: contact support |
| 503 | Maintenance mode: the service is temporarily unavailable. Retry after the period indicated in the response. |
API usage is limited by your monthly plan quota. Each verification or find request counts as one credit. Unused credits roll over for one month.
| Plan | Monthly Credits | Price |
|---|---|---|
| Free | 600 | $0/month |
| Starter | 10,000 | $12/month |
| Growth | 50,000 | $49/month |
| Scale | 250,000 | $129/month |
Unused credits from the previous month carry over automatically (up to 1x your plan limit), giving you up to 2x credits in any single month.