API Documentation
Base URL: https://checkmail1.com/api
Authentication
All API requests require authentication via an API key passed in the Authorization header as a Bearer token. Get your API key from the dashboard.
Authorization: Bearer YOUR_API_KEY
Free tier: Sign up and get 100 free verifications — no credit card required. API keys are available immediately after registration.
Rate Limits
| Plan | Rate Limit | Burst |
| Free | 60 requests / minute | 10 concurrent |
| Starter ($9) | 120 requests / minute | 20 concurrent |
| Pro ($29) | 300 requests / minute | 50 concurrent |
| Business ($79) | 600 requests / minute | 100 concurrent |
| Enterprise ($199) | Unlimited | Unlimited |
When rate limited, the API returns HTTP 429 Too Many Requests. Implement exponential backoff in your client.
Single Email Verification
GET/api/verify
Verify a single email address. Returns existence status, confidence score, and detailed checks.
Query Parameters
| Parameter | Type | Description |
| email required | string | The email address to verify |
Example Request
curl "https://checkmail1.com/api/[email protected]" \
-H "Authorization: Bearer YOUR_API_KEY"
Example Response
{
"email": "[email protected]",
"status": "valid",
"valid": true,
"score": 95,
"confidence": "high",
"checks": {
"format": true,
"dns": true,
"disposable": false
}
}
Batch Email Verification
POST/api/verify/batch
Verify up to 1,000 emails in a single request. Each email costs 1 credit. Results are returned when all verifications complete.
Request Body
| Field | Type | Description |
| emails required | string[] | Array of email addresses (max 1,000) |
{
"results": [
{ "email": "[email protected]", "status": "valid", "valid": true, "score": 95 },
{ "email": "[email protected]", "status": "valid", "valid": true, "score": 90 },
{ "email": "[email protected]", "status": "invalid", "valid": false, "score": 0 }
],
"count": 3,
"credits_remaining": 97
}
Domain Intelligence
GET/api/domain
Get detailed email infrastructure information for any domain — MX records, SPF, DKIM, DMARC, and catch-all status.
Query Parameters
| Parameter | Type | Description |
| domain required | string | The domain to analyze (e.g. gmail.com) |
curl "https://checkmail1.com/api/domain?domain=gmail.com" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"domain": "gmail.com",
"mx": ["alt1.gmail-smtp-in.l.google.com", "gmail-smtp-in.l.google.com"],
"spf": { "exists": true, "record": "v=spf1 redirect=_spf.google.com" },
"dmarc": { "exists": true, "policy": "reject" },
"catch_all": false,
"disposable": false,
"provider": "Google Workspace"
}
Code Examples
curl
Node.js
Python
PHP
Go
# Single verification
curl "https://checkmail1.com/api/[email protected]" \
-H "Authorization: Bearer YOUR_API_KEY"
# Batch verification
curl -X POST "https://checkmail1.com/api/verify/batch" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"emails":["[email protected]","[email protected]"]}'
// npm install node-fetch (or use built-in fetch in Node 18+)
const API_KEY = 'YOUR_API_KEY';
const BASE = 'https://checkmail1.com/api';
// Single verification
async function verifyEmail(email) {
const res = await fetch(`${BASE}/verify?email=${encodeURIComponent(email)}`, {
headers: { 'Authorization': `Bearer ${API_KEY}` }
});
return res.json();
}
// Batch verification
async function verifyBatch(emails) {
const res = await fetch(`${BASE}/verify/batch`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ emails })
});
return res.json();
}
// Usage
verifyEmail('[email protected]').then(console.log);
verifyBatch(['[email protected]', '[email protected]']).then(r => console.log(r.results));
# pip install requests
import requests
API_KEY = 'YOUR_API_KEY'
BASE = 'https://checkmail1.com/api'
HEADERS = {'Authorization': f'Bearer {API_KEY}'}
# Single verification
def verify_email(email):
r = requests.get(f'{BASE}/verify', params={'email': email}, headers=HEADERS)
return r.json()
# Batch verification
def verify_batch(emails):
r = requests.post(f'{BASE}/verify/batch',
json={'emails': emails}, headers=HEADERS)
return r.json()
# Usage
result = verify_email('[email protected]')
print(result['status'], result['score'])
batch = verify_batch(['[email protected]', '[email protected]', '[email protected]'])
for r in batch['results']:
print(r['email'], '-', r['status'])
<?php
define('API_KEY', 'YOUR_API_KEY');
define('BASE', 'https://checkmail1.com/api');
// Single verification
function verifyEmail($email) {
$ch = curl_init(BASE . '/verify?email=' . urlencode($email));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . API_KEY]
]);
$res = curl_exec($ch);
curl_close($ch);
return json_decode($res, true);
}
// Usage
$result = verifyEmail('[email protected]');
echo $result['status']; // "valid"
echo $result['score']; // 95
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
)
const apiKey = "YOUR_API_KEY"
const baseURL = "https://checkmail1.com/api"
type VerifyResult struct {
Email string `json:"email"`
Status string `json:"status"`
Valid bool `json:"valid"`
Score int `json:"score"`
Confidence string `json:"confidence"`
}
func verifyEmail(email string) (VerifyResult, error) {
req, _ := http.NewRequest("GET",
baseURL+"/verify?email="+url.QueryEscape(email), nil)
req.Header.Set("Authorization", "Bearer "+apiKey)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil { return VerifyResult{}, err }
defer resp.Body.Close()
var result VerifyResult
json.NewDecoder(resp.Body).Decode(&result)
return result, nil
}
func main() {
r, _ := verifyEmail("[email protected]")
fmt.Printf("Status: %s, Score: %d\n", r.Status, r.Score)
}
Response Fields
| Field | Type | Description |
| email | string | The email address that was verified |
| status | string | valid, invalid, or unknown |
| valid | boolean|null | true = exists, false = does not exist, null = inconclusive |
| score | integer | Deliverability score 0–100 |
| confidence | string | high, medium, or low |
| checks.format | boolean | Passes RFC 5322 syntax validation |
| checks.dns | boolean | Domain has valid MX records |
| checks.disposable | boolean | Known disposable/temporary email domain |
Status Values
| Status | Meaning | Action |
valid | Mailbox confirmed to exist | Safe to send |
invalid | Mailbox does not exist | Remove from list |
unknown | Cannot confirm (catch-all, bot-protected) | Send with caution |
Error Codes
| HTTP Code | Error | Description |
| 400 | invalid_email | Email format is invalid |
| 401 | unauthorized | Missing or invalid API key |
| 402 | insufficient_credits | Account has no credits remaining |
| 429 | rate_limited | Too many requests — slow down |
| 500 | server_error | Internal error — retry after 30s |
Supported Providers
CheckMail1 uses provider-specific native verification for major email providers, delivering high-confidence results where standard SMTP checks fail.
| Provider | Method | Confidence |
| Gmail / Google Workspace | Native account verification | High |
| iCloud / me.com / mac.com | Apple native account check | High |
| Yahoo / AOL / Verizon | Native account verification | High |
| Outlook / Hotmail / Live | Microsoft native API | High |
| QQ Mail (qq.com) | Tencent native check | High |
| 163 / 126 / yeah.net | NetEase native check | High |
| Naver (naver.com) | Naver native check | High |
| Proton Mail | Proton native API | High |
| Yandex | Yandex native check | High |
| GMX / Web.de | Native verification | High |
| Mail.ru / VK Mail | Native verification | High |
| All other domains | SMTP handshake verification | Medium |