Documentation

Email and phone

Last updated:

Get a person's business email addresses or phone numbers by profile id — Verified email and Verified phone number. You pay only when we hold one.

GET/v1/profiles/{id}/email
GET/v1/profiles/{id}/phone

Authenticated with your x-api-key. See Authentication.

How it works

Pass a profile id — the same id a search result carries — to get that person's Verified email (/email: every business email address we hold) or Verified phone number (/phone: up to 3 numbers, best first).

You pay only when we hold one. A person we hold nothing for returns a 200 with has_email: false / has_phone: false and is charged `0`. Read has_email / has_phone first: false is a complete answer, not a failure, and retrying it will not change the result. A 404 profile_not_found means no such profile — a different thing from a profile with no email or phone.

Only business addresses are returned — personal mailboxes (Gmail, Outlook and the like) are not. A phone number is returned only when its country is known from the number itself or from the person's location.

Request

GET /v1/profiles/{id}/email
Host: search-api.xverum.com
x-api-key: XVERUM-API-KEY

Path parameter

ParameterDescription
idOpaque profile id, e.g. from a search result's id

Example

curl "https://search-api.xverum.com/v1/profiles/a1b2c3d4/email" \
  -H "x-api-key: XVERUM-API-KEY"
curl "https://search-api.xverum.com/v1/profiles/a1b2c3d4/phone" \
  -H "x-api-key: XVERUM-API-KEY"

Response — email

FieldTypeDescription
has_emailbooleanWhether we hold a business email for this person. Check this first.
emailsobject[]Every address we hold; [] when has_email is false
emails[].emailstringThe address, lowercased
emails[].confidencestring | nullThe source's confidence in the address, e.g. High; null if none
emails[].last_checkedstring | nullWhen the address was last checked (YYYY-MM-DD); null if unknown
credits_usedintegerCredits deducted — 2 when an email is held, 0 when it is not
credits_remainingintegerBalance left after this call
request_idstringCorrelation id — also returned in the X-Request-Id header
{
  "has_email": true,
  "emails": [
    { "email": "[email protected]", "confidence": "High", "last_checked": "2026-09-01" }
  ],
  "credits_used": 2,
  "credits_remaining": 4998,
  "request_id": "1a2b3c4d5e6f7081"
}

Response — phone

FieldTypeDescription
has_phonebooleanWhether we hold a phone for this person. Check this first.
phonesobject[]Up to 3 numbers, best first; [] when has_phone is false
phones[].phonestringThe number in international (E.164) form
phones[].extensionstringThe extension; "" when there is none
phones[].line_typestring | nullmobile, fixed_line and so on; null if unknown
phones[].countrystring | nullThe number's country (ISO 3166-1 alpha-2); null if non-geographic
phones[].country_sourcestringHow country was decided: number (from the number's own country code) or person_country (from the person's location)
credits_usedintegerCredits deducted — 6 when a phone is held, 0 when it is not
credits_remainingintegerBalance left after this call
request_idstringCorrelation id — also returned in the X-Request-Id header
{
  "has_phone": true,
  "phones": [
    {
      "phone": "+12025550123",
      "extension": "",
      "line_type": "mobile",
      "country": "US",
      "country_source": "number"
    }
  ],
  "credits_used": 6,
  "credits_remaining": 4994,
  "request_id": "1a2b3c4d5e6f7081"
}

Example responses — nothing held

{
  "has_email": false,
  "emails": [],
  "credits_used": 0,
  "credits_remaining": 5000,
  "request_id": "1a2b3c4d5e6f7081"
}
{
  "has_phone": false,
  "phones": [],
  "credits_used": 0,
  "credits_remaining": 5000,
  "request_id": "1a2b3c4d5e6f7081"
}

Billing

A delivered email costs 2 credits and a delivered phone 6 credits — per person, however many addresses or numbers they have — echoed as credits_used. When nothing is held the call is free. Each charge is deduped per (api-key, id) within a short window, separately for email and phone: buying a person's email never makes their phone free.

Two identical calls sent at the same moment are billed once: the second is answered 409 request_in_progress with a Retry-After header — wait and retry, and the repeat is free.

Errors

All /v1 errors use the structured envelope (see Authentication):

Statuserror.codeCondition
401invalid_api_keyMissing or invalid API key
402out_of_creditsOut of credits — the envelope carries an upgrade_url to top up
403account_not_authorizedAccount not authorized
404profile_not_foundNo profile exists for the given id
409request_in_progressAn identical call is still in flight — retry after Retry-After
422validation_errorThe id is empty or longer than 128 characters
429rate_limitedRate limit exceeded — see Rate limits
502upstream_unavailableThe contact store failed — nothing charged, retry shortly
503search_unavailableTemporarily unavailable — retry shortly