Developer reference · v1
Email Validation API Reference
Overview
Product-true HTTP contract for Lucenri email verification. This page documents routes and fields implemented in production code.
Results are decision-support signals — not inbox-delivery guarantees. Limits are deployment-published and may change; always read
GET /api/config/public.
Not documented here as normal developer API: guest trial routes, /warmup,
/accuracy-smoke, admin surfaces, or controlled mail-lab evidence flows.
Authentication
External integrations should authenticate with an API key header:
Request header
x-api-key: lcr_your_api_key
- Keys use the
lcr_prefix. - API keys are for server-side integrations only. Never expose them in browser bundles or public clients.
- API key use requires a verified account email. Unverified accounts receive HTTP
403.
Lucenri’s product web app may also authenticate with a session cookie or
Authorization: Bearer <jwt>.
JWT is product-app authentication — not the recommended primary path for external developers.
Base URL
Production base URL:
https://lucenri.com
Verification routes are mounted under /api/verify. Public config is under /api/config/public.
Verify one email
POST /api/verify/single · authenticated · synchronous · consumes 1 credit when accepted
JSON body
{
"email": "[email protected]"
}
The server trims and lowercases the address. Missing or invalid input returns HTTP 400.
Successful response includes success, result, and current balance.
Verify a synchronous list
POST /api/verify/bulk · authenticated · synchronous JSON
JSON body
{
"emails": [
"[email protected]",
"[email protected]"
]
}
- This API accepts a JSON array. CSV/file upload is a Lucenri frontend workflow, not this request format.
- Entries are trimmed, lowercased, filtered (must contain
@, max length 254), and deduplicated. - If no usable email remains, the request fails with HTTP
400. - Lists at or above the published async threshold are rejected with
asyncRequired: true. Use jobs instead.
Success returns results, balance, mode: "sync", optional batchId, and retention fields when available.
Create asynchronous verification job
POST /api/verify/jobs · authenticated · returns HTTP 202
Same JSON emails array contract as bulk. Use this path for lists at or above the published async threshold (and for any async workflow up to the published max).
Example 202 response fields
{
"success": true,
"mode": "async",
"jobId": "…",
"status": "queued",
"total": 1200,
"balance": 8800,
"message": "Verification queued. Poll GET /api/verify/jobs/:id for progress."
}
Poll async job
GET /api/verify/jobs/:id · authenticated
Job status literals:
queuedprocessingcompletedfailed
Poll responses include progress fields (processed, progress).
Completed jobs may include batchId. For large result sets, prefer batch result endpoints rather than relying solely on inline poll payloads.
Batch history
GET /api/verify/batches · authenticated — recent scans for the authenticated account.
Batch detail / results
GET /api/verify/batches/:id— batch detailGET /api/verify/batches/:id/results— paginated results
Missing or expired scans return HTTP 404.
CSV export
GET /api/verify/batches/:id/export.csv · authenticated — CSV export stream of batch results.
Mark download complete / purge
POST /api/verify/batches/:id/downloaded · authenticated — mark download complete; may purge retained payload.
Dynamic limits
GET /api/config/public (no auth) publishes deployment values including:
asyncVerifyThresholdmaxBulkEmails
Current product defaults are 1000 for the async threshold and 10000 for max bulk emails, but both are environment-configurable. Clients must read the published values and must not treat defaults as permanent API guarantees.
- Below async threshold: synchronous
/bulkis available. - At or above async threshold: use
POST /api/verify/jobs.
There is no documented 500-email per-job API cap. Chunk/page sizes used internally are not a public upload ceiling.
Result schema
Public result object fields:
email— normalized addressvalid— boolean decision-support flagstatus— taxonomy literalseverity—success|warning|error|infocode— machine-oriented result code string (for exampleok-valid,err-syntax)confidence— integer 0–100 relative decision-support score; not a delivery guaranteechecks— array of{ step, result, code }whereresultispass|fail|skip
Optional when present: input_email, alias_normalized, free_email, domain_age_days.
disposable may appear as a deprecated boolean compatibility mirror when status is disposable. Prefer status.
There is no public reason or score field.
Status values
Stable public taxonomy:
validinvaliddisposableroletypocatch_allriskyunknown
Map these categories to your application policy. unknown and risky indicate uncertainty — treat as non-final for send decisions.
Verification checks
Always available in the local product path:
- Syntax validation
- Normalization (including common mailbox alias normalization)
- Disposable detection
- Typo-domain detection
- Role-address detection
- Public DNS / MX / null-MX related domain checks
Conditional:
- SMTP recipient checks may run when enabled for the deployment.
- Major mailbox providers may be skipped; results may remain
unknown. - Catch-all probing may be attempted when SMTP probing runs. It is not guaranteed for every domain.
Lucenri does not promise inbox placement, universal SMTP probing, universal catch-all detection, or public ninety-nine-plus percent accuracy claims.
Credits
- Verification consumes credits based on unique emails after server-side deduplication.
- Credit availability is checked before processing.
- Credits are reserved/deducted before verification execution.
- Eligible synchronous failures refund deducted credits.
- Failed or recovered asynchronous jobs refund reserved credits.
- Insufficient credits return HTTP
402.
Commercial plan prices and credit packs are published on /pricing. Do not hard-code prices from older setup notes.
Errors
Common error envelope:
{
"success": false,
"error": "…"
}
Relevant HTTP statuses include 400, 401, 402, 403, 404, 429, 500, and 503.
HTTP status plus documented response fields are the stable integration signals.
Free-text error strings are human-readable and should not be treated as a permanent machine enum.
For HTTP 429, inspect Retry-After and rate-limit headers when present, and honor retryAfterSec in the JSON body when returned.
Rate limits
The API is rate limited. Exact numeric ceilings are configuration-dependent and may change by deployment.
- Clients must handle HTTP
429. - When returned, inspect
X-RateLimit-Limit,X-RateLimit-Remaining, andRetry-After.
Do not hard-code a permanent requests-per-minute SLA from documentation examples.
Retention
Current deployment default retention for verification batch payloads is 72 hours,
but retention is environment-configurable. Prefer returned retentionHours / expiry fields when present,
and download or export results promptly.
POST /api/verify/batches/:id/downloaded may purge retained result data after download.
OpenAPI specification
Machine-readable contract:
/features/email-validation-api/openapi.json
(OpenAPI 3.0.3). Recommended public integration paths are JSON single/bulk and async jobs — not SSE.
Advanced: Lucenri web-product streaming transport
POST /api/verify/bulk/stream is an authenticated Server-Sent Events transport used primarily by the Lucenri web product
for synchronous lists below the async threshold. Event payloads use data: {json} with
type values such as start, progress,
complete, and error.
For public integrations, prefer POST /api/verify/bulk (sync JSON) and
POST /api/verify/jobs (async). SSE is not the primary OpenAPI v1 surface.
Optional health
GET /api/verify/ping — unauthenticated readiness ping returning success, service, and ready.
Accuracy / SMTP / catch-all limitations
- Verification supports product decisions; it does not guarantee mailbox existence or inbox placement.
- SMTP recipient checks are conditional and may be skipped for major providers.
- Catch-all detection is conditional and not universal.
- Confidence is relative decision support (0–100), not a delivery percentage claim.