Getting Started

Results and billing

Distinguish successful processing, enrichment outcomes, validation status, and credit usage.

A successful API request does not always mean LeadX found a record or charged a credit. Treat processing, result quality, and billing as separate outcomes.

Evaluate outcomes independently

OutcomeFields to inspectMeaning
Request processingHTTP status and successWhether LeadX accepted and processed the request
Match resultrecords, email, mobile_number, or row-level resultWhether the request returned usable data
Data qualityemail_status or email_validation_statusThe quality classification associated with an email
Credit usagebilling, credits_debited, or job countersWhether the completed work consumed credits

Do not treat success: true as result found, and do not infer a charge from the presence of a result. Inspect the endpoint-specific result and billing fields.

Interpret search responses

Search endpoints that return a records array use an empty successful response for no matches:

{
  "success": true,
  "records": [],
  "page_number": 1,
  "per_page": 50,
  "total_pages": 0,
  "total_records": 0
}

This is not an error. Continue only when records contains the data your workflow requires.

Interpret email discovery

POST /v1/emails/find returns 200 OK for both a match and a confirmed no-result lookup.

Conditionemailbilling.credits_debitedbilling.reason
New billable resultEmail address1null
No email foundnull0EMAIL_NO_RESULTS
Catch-all resultEmail address0EMAIL_CATCH_ALL
Same lookup was charged within 30 daysEmail address0EMAIL_FREE_WITHIN_30D
{
  "success": true,
  "email": null,
  "email_status": null,
  "input": {
    "first_name": "Jane",
    "last_name": "Smith",
    "url": "example.com",
    "linkedin_url": null
  },
  "billing": {
    "credit_type": "EMAIL",
    "credits_debited": 0,
    "reason": "EMAIL_NO_RESULTS",
    "balance_after": 125,
    "mode": "CLIENT"
  }
}

Email discovery normalizes a returned email to one of these statuses:

email_statusMeaningRecommended handling
VALIDThe address passed the discovery workflow's validation checksUse it according to your outreach policy
CATCH_ALLThe domain can accept mail without confirming the individual mailboxApply additional verification or suppress automated outreach
nullLeadX did not return an emailRecord a no-result outcome instead of treating it as an error

Interpret mobile discovery

POST /v1/mobile-numbers/find follows the same processing pattern, but its no-debit field is named credits_no_debit_reason.

Conditionmobile_numberbilling.credits_debitedbilling.credits_no_debit_reason
New billable resultPhone number1Omitted
No number foundnull0MOBILE_NO_RESULTS
Same lookup was charged within 30 daysPhone number0MOBILE_FREE_WITHIN_30D

Always use credits_debited as the authoritative per-response charge. Use the reason field to explain a zero-credit result.

Interpret email validation

Email validation reports a quality result. The status does not itself indicate whether a credit was charged.

StatusMeaningRecommended handling
ValidThe address passed the available validation checksKeep the address if it also meets your business rules
InvalidThe address failed syntax or validation checksSuppress it and correct the source data before retrying
RiskyLeadX could not confirm the mailbox with enough certainty for a Valid resultRoute it through a stricter review or outreach policy
UnknownValidation did not produce a definitive classificationPreserve the status and retry only if your policy allows a later recheck

These values are case-sensitive. Email discovery uses uppercase VALID and CATCH_ALL; email validation uses title-case Valid, Invalid, Risky, and Unknown.

mx_records adds the normalized primary MX hostname when available. It does not change the meaning of email_status.

Interpret bulk email rows

The JSON bulk-email results endpoint returns one outcome per external_id:

resultMeaningFields to inspect
pendingThe row has not finishedPoll the job, then fetch this row again
foundAn email was returnedemail, email_status, credits_debited, and reason
not_foundProcessing completed without an emailreason and credits_debited
errorThe row could not completeerror, reason, and credits_debited

Use external_id to join the result to your source system. Use row_index only for cursor pagination and input-order reconciliation.

The job status response aggregates processed, found, and credits_debited. These counters answer different questions and are not expected to have the same value.

Reconcile credits safely

  • Record credits_debited with the result you persist.
  • Preserve the no-debit reason for support and audit workflows.
  • Sum row-level credits_debited when reconciling a JSON bulk job.
  • Do not retry a successful no-result row as though it were a transient failure.
  • Treat a received 502 or 504 as a transient processing failure, not a confirmed no-result.

See Reliability and retries before automating retries. For an end-to-end bulk workflow, see Run a bulk enrichment workflow.