Documentation

Find a person by email or phone

Last updated:

Find the person behind a work email address or a phone number. 1 credit per person found — nothing when there is no match.

POST/v1/lookup

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

How it works

Send a whole work email address or a whole phone number, and get back the people who hold it — the same profile summaries a search returns, each with its id.

Exact match only. The whole email address ([email protected]), and the whole phone number with its country code (+972 50 254 4777 or 00972502544777; spaces, dashes and brackets are fine). A number without its country code is refused with a 422 saying so: the same digits are a different number in each country, so we never guess one.

The person, not their contact data. A lookup tells you who holds the email or number. To get that person's email addresses or phone numbers, pass the id to Email and phone; for the full profile, to GET /v1/profiles/{id}.

You pay only for people found. No match returns a 200 with results: [] and is charged `0`.

Request

POST /v1/lookup
Host: search-api.xverum.com
x-api-key: XVERUM-API-KEY
Content-Type: application/json

Body

Send exactly one of email or phone.

FieldTypeRequiredConstraintsDescription
emailstringone of3–320 charsA whole work email address, matched exactly
phonestringone of4–40 chars, must start with + or 00A whole phone number with its country code, matched exactly

Example body

{ "email": "[email protected]" }
{ "phone": "+1 202 555 0123" }

Example

curl -X POST "https://search-api.xverum.com/v1/lookup" \
  -H "x-api-key: XVERUM-API-KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "[email protected]"}'
curl -X POST "https://search-api.xverum.com/v1/lookup" \
  -H "x-api-key: XVERUM-API-KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone": "+1 202 555 0123"}'

Response — 200 OK

FieldTypeDescription
resultsobject[]The people who hold this email or number, at most 10; [] when there is no match
results[].idstringOpaque profile id — pass it to Email and phone or GET /v1/profiles/{id}
results[].full_namestringFull name
results[].headlinestring | nullProfile headline
results[].locationstring | nullLocation
results[].company_namestring | nullCurrent company
results[].positionstring | nullCurrent position
results[].industrystring | nullIndustry
results[].social_urlstring | nullPublic profile URL
results[].evidence_summarystringHow recently the profile was verified
morebooleantrue when more people hold this value than were returned (a shared address such as info@…, or a switchboard number). There is no paging
credits_usedintegerCredits deducted — 1 per person returned, 0 when there is no match
credits_remainingintegerBalance left after this call
request_idstringCorrelation id — also returned in the X-Request-Id header
messagestringOnly when no one is shown — no match, or more with none that can be shown: guidance to show the user. Do not parse it
{
  "results": [
    {
      "id": "a1b2c3d4",
      "full_name": "Jane Doe",
      "headline": "VP Sales at Acme",
      "location": "Washington, DC, United States",
      "company_name": "Acme",
      "position": "VP Sales",
      "industry": "Software Development",
      "social_url": "https://www.linkedin.com/in/jane-doe",
      "evidence_summary": "Verified last 30 days"
    }
  ],
  "more": false,
  "credits_used": 1,
  "credits_remaining": 4999,
  "request_id": "1a2b3c4d5e6f7081"
}

Example response — no match

{
  "results": [],
  "more": false,
  "credits_used": 0,
  "credits_remaining": 5000,
  "request_id": "1a2b3c4d5e6f7081",
  "message": "No one found for that email address or phone number."
}

Billing

1 credit per person returned, echoed as credits_used. No match is free. A lookup is not deduped: repeating it is charged again.

If your balance is smaller than the number of people found, the list is cut to what you can pay for and more is true. With less than 1 credit the call is refused with 402 before anything is looked up.

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
422validation_errorNot exactly one of email / phone, not a whole email address, or a number without its country code — the message says which
429rate_limitedRate limit exceeded — retry after Retry-After. See Rate limits
502upstream_unavailableThe contact store failed — nothing charged, retry shortly
503search_unavailableTemporarily unavailable, or the lookup took too long — retry shortly