Skip to main content
PushMail.dev

Email Validation

Validate email addresses before sending with syntax, MX, disposable domain, and role-based address checks. Available as a standalone API with free tier.

Overview

PushMail's email validation API lets you verify email addresses before adding them to your lists or sending. Every validation runs four checks:

CheckDescription
SyntaxRFC-compliant format, valid local part length (max 64 chars) and domain length (max 253 chars)
MX recordsDNS lookup via Cloudflare DoH to confirm the domain can receive email. Falls back to A record per RFC 5321
DisposableChecks against a built-in list of 60+ disposable email providers (mailinator, guerrillamail, etc.)
Role-basedDetects generic addresses like admin@, noreply@, support@ that are typically not personal inboxes

Results are cached per domain (MX lookups) so repeated validations for the same domain are fast.

Pricing

TierCost
First 100 validations/monthFree
Additional validations1 cent each (deducted from credit balance)

Your free allowance resets at the start of each calendar month.

Single validation

curl -X POST https://pushmail.dev/api/v1/validate \
  -H "Authorization: Bearer pm_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "email": "user@example.com" }'

Response:

{
  "data": {
    "email": "user@example.com",
    "valid": true,
    "checks": {
      "syntax": true,
      "mx": true,
      "disposable": false,
      "role": false
    }
  }
}

When validation fails, a reason field explains why:

{
  "data": {
    "email": "test@mailinator.com",
    "valid": false,
    "checks": {
      "syntax": true,
      "mx": true,
      "disposable": true,
      "role": false
    },
    "reason": "Disposable email address"
  }
}

A suggestion field appears when a common typo is detected (e.g. gmial.com suggests gmail.com).

Batch validation

Validate up to 100 emails in a single request:

curl -X POST https://pushmail.dev/api/v1/validate \
  -H "Authorization: Bearer pm_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "emails": [
      "alice@gmail.com",
      "bob@mailinator.com",
      "admin@example.com"
    ]
  }'

Response:

{
  "data": {
    "results": [
      { "email": "alice@gmail.com", "valid": true, "checks": { "syntax": true, "mx": true, "disposable": false, "role": false } },
      { "email": "bob@mailinator.com", "valid": false, "checks": { "syntax": true, "mx": true, "disposable": true, "role": false }, "reason": "Disposable email address" },
      { "email": "admin@example.com", "valid": true, "checks": { "syntax": true, "mx": true, "disposable": false, "role": true } }
    ],
    "count": 3,
    "cost": {
      "freeUsed": 3,
      "paidCount": 0,
      "totalCostCents": 0
    }
  }
}

Rate limits

The validation endpoint is rate limited to 100 requests per minute per organization (same as other API endpoints). Each request can contain up to 100 emails in batch mode, so you can validate up to 10,000 emails per minute.

Error responses

StatusMeaning
401Missing or invalid API key
400Invalid JSON or missing email/emails field
402Insufficient credits for paid validations
429Rate limit exceeded

On this page