Back to API tokens
API Reference

API Documentation

Integrate email verification into your apps using our REST API.

Base URL
https://api.mails.expert
Auth
Bearer token
Endpoints
Single verify + bulk jobs
Authentication

All API requests require a Bearer token in the Authorization header. You can use either a JWT token (from login) or an API token (created in the dashboard).

Single Email Verification

Verify a single email address. Costs 1 token.

Bulk Email Verification

Submit a list of emails for verification. Costs 1 token per email.

Official npm package

Use the mails.expert package for faster integration

If you prefer shipping through an npm package instead of building raw HTTP requests by hand, use the community package for mails.expert and start from a cleaner integration setup.

Install package
npm install @d2sutils/mails-expert

Open the package page in a new tab to review usage, version history and installation details.

Authentication

All API requests require a Bearer token in the Authorization header. You can use either a JWT token (from login) or an API token (created in the dashboard).

Authorization: Bearer YOUR_TOKEN

API tokens start with mv_ prefix.

Single Email Verification

Verify a single email address. Costs 1 token.

Request
POST /v1/verify
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN

{
  "email": "test@example.com"
}
Response
{
  "email": "test@example.com",
  "result": "valid",
  "checks": {
    "format": true,
    "domainExists": true,
    "hasMx": true,
    "domainReachable": true,
    "smtpStatus": "valid",
    "isDisposable": false,
    "isRole": false,
    "isBlacklisted": false,
    "isKnownProvider": true,
    "isCatchAll": false
  },
  "reason": "250 2.1.5 OK"
}

Bulk Email Verification

Submit a list of emails for verification. Costs 1 token per email.

1. Submit emails
POST /v1/bulk-verify
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN

{
  "emails": [
    "user1@example.com",
    "user2@example.com",
    "info@company.com"
  ]
}

// Response:
{
  "jobId": "abc-123",
  "queued": 3
}
2. Poll progress
GET /v1/bulk-verify/abc-123/progress
Authorization: Bearer YOUR_TOKEN

// Response:
{
  "job_id": "abc-123",
  "status": "processing",
  "total": 3,
  "processed": 2,
  "progress_percent": 66
}
3. Get results
GET /v1/bulk-verify/abc-123
Authorization: Bearer YOUR_TOKEN

// Response:
{
  "id": "abc-123",
  "status": "completed",
  "total": 3,
  "processed": 3,
  "results": [
    { "email": "user1@example.com", "result": "valid" },
    { "email": "user2@example.com", "result": "invalid" },
    { "email": "info@company.com", "result": "catch_all" }
  ]
}

Result Types

  • valid — Email is deliverable
  • invalid — Email does not exist or is undeliverable
  • risky — Email exists but is disposable, role-based, or blacklisted
  • catch_all — Domain accepts any email (catch-all server)
  • unknown — Could not determine deliverability

Check Fields

Each response includes detailed check results:

format        — Email format is valid
domainExists  — Domain exists (DNS resolves)
hasMx         — Domain has MX records
domainReachable — Domain web server responds
smtpStatus    — SMTP RCPT TO result: valid / invalid / unknown
isDisposable  — Temporary/disposable email provider
isRole        — Role-based address (admin@, info@, support@...)
isBlacklisted — Found on spam blacklists
isKnownProvider — Known trusted provider (Gmail, Yahoo, etc.)
isCatchAll    — Domain accepts all addresses (catch-all)

cURL Examples

Single verify
curl -X POST https://api.mails.expert/v1/verify \
  -H "Authorization: Bearer mv_your_api_token" \
  -H "Content-Type: application/json" \
  -d '{"email": "test@example.com"}'
Bulk verify
curl -X POST https://api.mails.expert/v1/bulk-verify \
  -H "Authorization: Bearer mv_your_api_token" \
  -H "Content-Type: application/json" \
  -d '{"emails": ["a@example.com", "b@example.com"]}'

Rate Limits

API requests are rate-limited per user. If you exceed the limit, you will receive a 429 status code. Contact support for higher limits.

Error Codes

  • 401 — Invalid or missing authentication token
  • 402 — Insufficient tokens (buy more credits)
  • 429 — Rate limit exceeded
  • 500 — Internal server error