Developers
Validation API
Validate email addresses from your own application. Each live validation performs an SMTP RCPT TO probe through your own mail relay; no real email is sent. One live check costs 1 credit; results already fresh in your history are reused for free.
1. Get an API key
- Create an account and sign in at the sign-in page.
- Buy credits on the Buy credits page (pay as you go, no subscription).
- Open the API page in your dashboard and click Create API key.
- Copy the key immediately — it starts with
lv_and is shown only once. You can revoke it at any time from the same page.
2. Authenticate
Send the key on every request, either as a bearer token:
Authorization: Bearer lv_your_api_keyor as a header:
x-api-key: lv_your_api_key3. Validate emails
POST /api/public/v1/validate
Request body (JSON):
| Field | Type | Description |
|---|---|---|
| string | Single address to validate (or use emails). | |
| emails | string[] | Up to 100 addresses per request. Duplicates are removed free. |
| force_revalidation | boolean | Default false. When true, ignore history and validate live (costs 1 credit each). |
| max_result_age_days | number | null | Override how old a stored result may be to be reused (0–365). Omit to use the account default freshness policy. |
Example — single address:
curl -X POST https://leodora-validator.lovable.app/api/public/v1/validate \
-H "Authorization: Bearer lv_your_api_key" \
-H "Content-Type: application/json" \
-d '{"email": "jane@example.com"}'Example — a batch:
curl -X POST https://leodora-validator.lovable.app/api/public/v1/validate \
-H "Authorization: Bearer lv_your_api_key" \
-H "Content-Type: application/json" \
-d '{"emails": ["a@example.com", "b@example.com"], "force_revalidation": false}'4. Response
{
"results": [
{
"email": "jane@example.com",
"status": "VALID",
"sub_status": null,
"source": "live",
"validated_at": "2026-09-19T09:00:00.000Z"
},
{
"email": "old@example.com",
"status": "INVALID",
"sub_status": "mailbox_not_found",
"source": "history",
"validated_at": "2026-09-10T14:22:00.000Z"
}
],
"total": 2,
"reused_from_history": 1,
"validated_live": 1,
"credits_used": 1,
"credits_balance": 4999
}status is one of VALID, INVALID, CATCH_ALL or UNKNOWN. source tells you whether the result came from a live check (live) or was reused from your history (history).
5. Credits
- 1 live validation = 1 credit. Credits are integers and never expire.
- Results fresh in your history are reused at 0 credits.
- Duplicate addresses inside one request are removed at 0 credits.
- UNKNOWN results cost 0 credits by default (configurable by the admin).
- If your balance is insufficient, nothing is validated and you receive
402withcredits_requiredandcredits_available. - Your account can never go negative.
6. Errors
| Status | Meaning |
|---|---|
| 400 | Invalid request body or no usable addresses. |
| 401 | Missing, invalid or revoked API key. |
| 402 | Insufficient credits. Buy more on the Buy credits page and retry. |