Email check
You are reading the v1 reference. v1 keeps working unchanged; new capabilities (several identities per request, risk scores, richer module data) are in v2. See migrating from v1.
Mailbox-level facts about a single address, without running a platform sweep.
Request
curl -X POST https://api.digifootprint.dev/v1/email \
-H "Authorization: Bearer dfp_live_..." \
-H "Content-Type: application/json" \
-d '{"email": "someone@example.com"}'{
"lookupId": "19ce26f7-cf8f-4977-850a-2b7bfcba8ec1",
"query": "someone@example.com",
"emailDetails": {
"deliverable": true,
"disposable": false,
"freeProvider": false,
"acceptAll": false,
"domainAgeDays": 4021,
"domainRegisteredAt": "2015-09-24"
}
}What comes back
deliverable means the mailbox itself exists and accepts mail, established over SMTP rather than guessed from the domain. disposable flags throwaway providers. freeProvider distinguishes consumer webmail from a custom domain.
domainAgeDays is how long the address’s domain has been registered, from public registration records. It is null for consumer webmail on purpose: a thirty-year-old gmail.com says nothing about an account created yesterday. The field carries signal only for custom domains — which is exactly where it is used, because a signup from a domain registered three weeks ago is the thing worth catching.
Catch-all domains
A catch-all domain accepts every address, so no amount of probing can establish whether one particular mailbox exists. When acceptAll is true, deliverable comes back null rather than true.
{
"deliverable": null,
"acceptAll": true
}Reading that null as a pass is the single most common way this kind of check gets misused. It means the question could not be answered, not that the answer was yes.
Speed
A real mailbox typically resolves in two to four seconds, and a repeat check inside the cache window in tens of milliseconds. Addresses that do not exist are slower, because a mail server that intends to refuse an address is under no obligation to do so promptly. That wait is the price of an answer established over SMTP instead of inferred.
Billing
One email check is billed as one lookup and appears in your history with its own lookupId. To get these fields alongside a full platform sweep instead, use POST /v1/lookup with {"checks": {"email": true}}.