Integrate email verification
in under 10 minutes

JSON REST API. Bearer token authentication. Latency <200 ms. 100% Verification run in France, GDPR compliant.

Get my API key for free View integrations

Base URL

https://api.mailcheck.fr/v1

All requests are over HTTPS. Insecure HTTP calls are rejected with a 400 code.

Authentication

All requests require a Bearer token in the Authorization header. Your API key is available in the dashboard, under Settings > API Key.

HTTP Header
Authorization: Bearer mc_live_xxxxxxxxxxxxxxxxxxxx
Never commit your API key into your source code. Use environment variables (MAILCHECK_API_KEY).

POST /v1/verify, verifying an address

Verifies a single email address. Returns the status, the score and the verification details.

Request

FieldTypeRequiredDescription
emailstringYesThe email address to verify
options.catch_allbooleanNoEnables catch-all detection (default: true)
JSON Body
{
  "email": "[email protected]",
  "options": {
    "catch_all": true
  }
}

Response format

The response is a JSON object with the following fields:

FieldTypeDescription
emailstringThe verified address (normalized to lowercase)
statusstringvalid / invalid / risky / catch_all / disqualifie
scoreintegerConfidence score 0–100 (≥80 = reliable)
checks.syntaxbooleanValid RFC 5322 syntax
checks.dnsbooleanDomain resolved in DNS
checks.mxbooleanMX records present and active
checks.smtpbooleanMailbox confirmed via SMTP
checks.disposablebooleanDisposable address detected
checks.catch_allbooleanCatch-all (wildcard) server detected
confidencestringhigh / medium / low
JSON Response · 200 OK · 187 ms
{
  "email":      "[email protected]",
  "status":     "valid",
  "score":      97,
  "checks": {
    "syntax":     true,
    "dns":        true,
    "mx":         true,
    "smtp":       true,
    "disposable": false,
    "catch_all":  false
  },
  "confidence": "high"
}

Returned statuses

StatusMeaningRecommended action
valid Mailbox confirmed via SMTP, active domain, not disposable Include in your sends
risky Valid syntax and DNS but ambiguous SMTP or catch-all detected Send with caution or segment separately
catch_all Server accepts all incoming email (wildcard) Decide based on your risk tolerance
invalid Nonexistent mailbox confirmed by the server, invalid domain or incorrect syntax Remove from the list immediately
disqualifie Disposable address (domain in our blocklist) Remove, never any purchase intent

cURL example

cURL · Terminal
# Verify an email address
curl -X POST https://api.mailcheck.fr/v1/verify \
  -H "Authorization: Bearer mc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","options":{"catch_all":true}}'

Python example

Python 3.8+
import os
import requests

API_KEY = os.environ["MAILCHECK_API_KEY"]

def verify_email(email: str) -> dict:
    response = requests.post(
        "https://api.mailcheck.fr/v1/verify",
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json"
        },
        json={
            "email": email,
            "options": {"catch_all": True}
        },
        timeout=5
    )
    response.raise_for_status()
    return response.json()

# Usage example
result = verify_email("[email protected]")
if result["status"] == "valid":
    print(f"✓ Valid email · Score: {result['score']}")
else:
    print(f"✗ Status: {result['status']}")

Node.js example

Node.js (native fetch, Node 18+)
const API_KEY = process.env.MAILCHECK_API_KEY;

async function verifyEmail(email) {
  const res = await fetch("https://api.mailcheck.fr/v1/verify", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${API_KEY}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      email,
      options: { catch_all: true }
    })
  });

  if (!res.ok) {
    throw new Error(`API error: ${res.status}`);
  }

  return res.json();
}

// Usage example
verifyEmail("[email protected]")
  .then(data => {
    console.log(`Status: ${data.status} · Score: ${data.score}`);
  })
  .catch(console.error);

Rate limits

Limits apply per API key over a sliding window of 1 second.

PlanRequests / secondVerifications / month
Starter10 req/s5,000
Growth50 req/s50,000
Pro200 req/s200,000
Agency200 req/s1,000,000

When exceeded, the API returns a 429 Too Many Requests with a Retry-After header indicating the wait time in seconds.

Error codes

HTTP codeError codeDescription
400 invalid_request Invalid request body or missing email field
401 unauthorized Missing or invalid API key
402 insufficient_credits Monthly quota exhausted, top up your plan
429 rate_limit_exceeded Too many requests, see the Retry-After header
500 server_error Internal error, retry in a few seconds
Error response example · 402
{
  "error": "insufficient_credits",
  "message": "Your monthly quota is exhausted. Upgrade your plan.",
  "credits_remaining": 0
}

Ready to integrate?

Create your account for free and get your API key in under a minute. 2 free verifications.