API reference
Every endpoint rate.email exposes, generated straight from the OpenAPI spec that also backs the SDKs and the Magento extension.
Authentication
Send your API key as a bearer token, Authorization: Bearer <api_key>, or as X-Api-Key: <api_key>. Both forms work on every endpoint except GET /v1/reasons and GET /v1/health, which are public. A missing or invalid key returns 401 with a recovery hint in the response body, not a bare status code.
Verdict rule
verdict comes only from the severities present in reasons, never from the numeric score:
- Any
highseverity reason present:reject. - Else any
mediumseverity reason present:review. - Otherwise:
accept.
low and info reasons never change the verdict. They only move the score and add context.
Reason codes
Every reason includes a code, a severity, a source and a plain-language message. Codes are stable identifiers, always printed in upper case, never translated. See the fullreason code catalogue for every code, its penalty and an example trigger.
Try it
Real calls against https://api.rate.email. sk_live_REPLACE_WITH_YOUR_KEY is a placeholder and will never authenticate; use your own secret key from thedashboard.
Rating call
curl -s -X POST https://api.rate.email/v1/rate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk_live_REPLACE_WITH_YOUR_KEY" \
-d '{"email":"throwaway@mailinator.com"}'{
"email": "throwaway@mailinator.com",
"verdict": "reject",
"score": 40,
"reasons": [
{
"code": "DISPOSABLE_DOMAIN",
"severity": "high",
"message": "mailinator.com is a known disposable email domain."
}
]
}Run here with a placeholder key, so the API returns 401 instead of this result. Put in your own secret key from the dashboard and this is what you get back.
No key
curl -s -X POST https://api.rate.email/v1/rate \
-H "Content-Type: application/json" \
-d '{"email":"throwaway@mailinator.com"}'{
"type": "https://rate.email/problems/unauthorized",
"title": "Unauthorized",
"status": 401,
"detail": "No valid API key found in 'Authorization' or 'X-Api-Key' headers."
}Rating and domain lookups require a key on every call; only the reason catalogue and the health check are open.
Domain rating
curl -s https://api.rate.email/v1/domain/mailinator.com \
-H "Authorization: Bearer sk_live_REPLACE_WITH_YOUR_KEY"{
"domain": "mailinator.com",
"verdict": "reject",
"score": 40,
"reasons": [
{
"code": "DISPOSABLE_DOMAIN",
"severity": "high",
"message": "mailinator.com is a known disposable email domain."
}
]
}Reason code catalogue
curl -s https://api.rate.email/v1/reasons{
"reasons": [
{
"code": "SYNTAX_INVALID",
"severity": "high",
"source": "syntax",
"trigger": "Address fails RFC 5322 parsing."
},
{
"code": "DISPOSABLE_DOMAIN",
"severity": "high",
"source": "allowlist:disposable",
"trigger": "Domain itself is on the maintained disposable-domain list."
}
]
}Trimmed to two entries here. See the full reason code catalogue for every code.
Missing key
curl -s https://api.rate.email/v1/usage{
"type": "https://rate.email/problems/unauthorized",
"title": "Unauthorized",
"status": 401,
"detail": "No valid API key found in 'Authorization' or 'X-Api-Key' headers."
}GET /v1/usage reports your own account, so it needs a key regardless of tier.