Leodora Validator

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

  1. Create an account and sign in at the sign-in page.
  2. Buy credits on the Buy credits page (pay as you go, no subscription).
  3. Open the API page in your dashboard and click Create API key.
  4. 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_key

or as a header:

x-api-key: lv_your_api_key

3. Validate emails

POST /api/public/v1/validate

Request body (JSON):

FieldTypeDescription
emailstringSingle address to validate (or use emails).
emailsstring[]Up to 100 addresses per request. Duplicates are removed free.
force_revalidationbooleanDefault false. When true, ignore history and validate live (costs 1 credit each).
max_result_age_daysnumber | nullOverride 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 402 with credits_required and credits_available.
  • Your account can never go negative.

6. Errors

StatusMeaning
400Invalid request body or no usable addresses.
401Missing, invalid or revoked API key.
402Insufficient credits. Buy more on the Buy credits page and retry.