Skip to content
Enrichment API · v1

Append PII to any phone.

POST a list of phone numbers and get back names, demographics, addresses, emails, and the IP plus source URL we carry, all resolved against our own identity graph. No third-party API-uptime dependency. You query our warehouse directly.

One request, up to 100 phones

Batch a request and get a row per phone back in the same call.

Counts only, never your data

We log how many phones matched for billing. We never store your phones or the appended PII.

Simple key auth

One header. Create, pause, or revoke keys yourself on the Developers page.

What each endpoint returns

EndpointBuilt forReturnsTypical speed
POST /api/v1/resolveReal time (sub-second): live call routing, bidding, pre-qualificationOne identifier in (phone or hashed email). Modes: enrich (~24 core fields: identity, address, age, income + credit bands, homeowner, home value, best contacts), rtb (a single pass/fail against your filters, no PII), identity (hashes, IP, source URL).typically a few hundred milliseconds round trip over the public internet; identifiers outside the hot index fall back to a deeper lookup (phones and sha256 emails resolve in well under a second; md5 is a slower legacy path, so prefer sha256 for hashed email)
POST /api/v1/enrichBatch append: up to 100 phones per callCore identity + demographics + best contacts per phone, PLUS optional field groups: ~160 curated consumer attributes, ~165 property fields, financial, vehicles with VIN, executive roles, geo precision, all contacts, and purchase behavior.a few seconds for a full 100-phone batch (core fields); allow up to ~10 s with every field group attached
POST /api/v1/pullList building: homeowner lists by ZIP, on demandZIPs + filters (home value, year built, owner age, phone/email requirements) + a required record cap in; a queued order out. The CSV is emailed to the account and downloadable by key. Delivered records count toward the account's monthly plan.async; typically a few minutes to the file
POST /api/v1/append-phoneContact discovery: email or name+address in, phones outThe matched person's identity block, a match confidence grade, and every phone on file (type, rank, carrier, last seen, DNC status, and a single best-to-dial flag).1 to 3 s per batch

Speeds above are conservative planning figures that include real network time; most calls come back faster. The Playground shows your own latency from your network on every call.

Quickstart

Three steps to your first call.

  1. 1Sign up at talkdatatome.online/signup. Any plan works to start.
  2. 2Create a key on the Developers page. Copy it right away. The key is shown once and starts with rk_.
  3. 3Make a call with the key in the X-API-Key header. Pick your language below.

Prefer to skip straight to a running call? The API Playground runs every endpoint from your browser with your key, shows real latency, and hands you the exact cURL to reproduce it.

cURL
curl -X POST https://www.talkdatatome.online/api/v1/resolve \
  -H "X-API-Key: rk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"identifier": "4155550142"}'
Python
import requests

resp = requests.post(
    "https://www.talkdatatome.online/api/v1/resolve",
    headers={"X-API-Key": "rk_your_key_here"},
    json={"identifier": "4155550142"},
)
print(resp.json())  # {"matched": true, "first_name": "...", ...}
Node.js
const resp = await fetch("https://www.talkdatatome.online/api/v1/resolve", {
  method: "POST",
  headers: {
    "X-API-Key": "rk_your_key_here",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ identifier: "4155550142" }),
});
console.log(await resp.json()); // { matched: true, first_name: "...", ... }

That is the real-time /resolve endpoint, which answers a single identifier in well under a second. To append data to a whole list at once, use the batch /enrich endpoint below. Both take the same key.

Authentication

Every request must include your secret key in the X-API-Key header. Keys look like rk_… and are shown to you once at creation. Treat your key like a password and never expose it in client-side code. A missing, invalid, inactive, or expired key returns 401.

Create and manage keys yourself on the Developers page: issue a new key, pause or revoke any key, and watch this month's usage. The same key works for both endpoints below.

Header
X-API-Key: rk_your_key_here

Enrich phones

POST/api/v1/enrich

Send one phone via {"phone": "..."} or up to 100 via {"phones": ["...", "..."]}. Phones can be in any common format. We normalize to 10 digits and de-duplicate before resolving. Every submitted phone comes back in results, matched or not.

cURL
curl -X POST https://www.talkdatatome.online/api/v1/enrich \
  -H "X-API-Key: rk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"phones": ["+1 (415) 555-0142", "2025550173"]}'

Request body

{
  "phones": [
    "+1 (415) 555-0142",
    "2025550173"
  ]
}

Response

{
  "requested": 2,
  "matched": 1,
  "results": [
    {
      "phone": "+1 (415) 555-0142",
      "matched": true,
      "first_name": "Jordan",
      "last_name": "Avery",
      "age": 47,
      "gender": "M",
      "marital_status": "Married",
      "homeowner": "Home Owner",
      "household_income": 112500,
      "address": "1240 Oak Ridge Dr",
      "city": "San Francisco",
      "state": "CA",
      "zip": "94110",
      "mobile_phone": "4155550142",
      "landline_phone": "4155550199",
      "email": "jordan.avery@example.com",
      "ip_address": "73.92.18.204",
      "source_url": "homeimprovementquotes.com"
    },
    {
      "phone": "2025550173",
      "matched": false
    }
  ]
}

Null fields are omitted from a matched result, so a record only carries the attributes we actually hold. An unmatched phone returns just {"phone": "...", "matched": false}. You are billed for matched rows only.

Response fields

FieldTypeDescription
phonestringThe phone number you submitted, echoed back.
matchedbooleanWhether the phone resolved to an identity.
first_namestringGiven name on the resolved identity.
last_namestringFamily name on the resolved identity.
agenumberEstimated age.
genderstringGender on file.
marital_statusstringMarital status on file.
homeownerstringHome ownership status.
household_incomenumberEstimated household income midpoint.
addressstringStandardized street address.
citystringStandardized city.
statestringTwo-letter state code.
zipstringZIP code.
mobile_phonestringBest deliverable mobile number on the identity.
landline_phonestringBest landline on the identity.
emailstringBest email on the identity.
ip_addressstringIP address associated with the identity.
source_urlstringSource URL associated with the identity.

Field groups: the full data dictionary on batch enrich

The default response carries the core identity + demographic set above. Pass fields to nest entire data-dictionary sections on every matched row. Billing is unchanged: a matched row counts once no matter how many groups you request.

GroupReturnsShape
demographicsA curated ~160-attribute set from the consumer data tab: interests, purchase behavior, lifestyle, household composition, occupation, education, and more. Null-valued attributes are omitted per row. The full 2,000+ attribute tab is available through managed appends and file delivery.demographics: {...}
propertyThe property tab for the person's address: ~165 fields (year built, square footage, beds/baths, lot, pool, valuation, sale history, owner occupancy).property: {...}
financialThe financial tab: income, net-worth and investment indicators, credit activity.financial: {...}
autoThe consumer auto tab: up to 5 vehicles per person with VIN, make, model, year, body type, fuel, purchase date, and more.vehicles: [{...}]
geoTerritory precision for the person's address: latitude/longitude, county, DMA, MSA, CBSA, census tract and block group, congressional district, ZIP+4, urbanicity, plus birth month and year.geo: {...}
contactsEvery contact point on the person: up to 10 phones (type, rank, carrier, work-phone flag, DNC, quality, last seen) and up to 5 emails (rank, quality, opt-in, md5/sha256, register and update dates).contacts: {phones: [...], emails: [...]}
purchase_behavior~114 recent-purchase aggregates by category: dollars, orders, items, and company counts (apparel, home goods, donations, subscriptions, gourmet, and more).purchase_behavior: {...}
signalsLive in-market intent (rolling recent window): consumer and business topics the person is actively researching, with topic names, categories, frequency, and recency. Up to 25 of each per person.signals: {b2c: [...], b2b: [...]}
behaviorBehavioral interest codes (IAB) with recency, the weekly behavioral feed. Up to 50 per person.behavior: [{...}]
executiveThe B2B executive-at-home overlay: up to 3 roles with company, title, executive level, SIC/industry, revenue band, and business contact points. Present when the person is a linked business executive.executive_roles: [{...}]
Request with field groups
curl -X POST https://www.talkdatatome.online/api/v1/enrich \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phones": ["4155550142"], "fields": ["demographics", "property", "auto", "executive"]}'
Full example response (sample person, every group; field names are real)
{
  "requested": 1,
  "matched": 1,
  "results": [
    {
      "phone": "4155550142",
      "matched": true,
      "first_name": "Jordan",
      "last_name": "Avery",
      "age": 47,
      "gender": "M",
      "marital_status": "Married",
      "homeowner": "Home Owner",
      "household_income": 112500,
      "address": "1240 Oak Ridge Dr",
      "city": "San Francisco",
      "state": "CA",
      "zip": "94110",
      "mobile_phone": "4155550142",
      "landline_phone": "4155550199",
      "email": "jordan.avery@example.com",
      "ip_address": "73.92.18.204",
      "source_url": "homeimprovementquotes.com",

      "demographics": {
        "age": 47,
        "birth_year": 1979,
        "credit_range": "B. 750-799",
        "credit_midpts": 775,
        "dwelling_type": "Single Family",
        "length_of_residence": 9,
        "children_hh": 2,
        "child_aged_7_9_hh": "Y",
        "occupation_category": "Management",
        "education": "College",
        "net_worth_hh": "$250,000-$499,999",
        "home_improvement": "Y",
        "diy": "Y",
        "cooking": "Y",
        "dog_owner": "Y",
        "camping_hiking": "Y",
        "travel_affinity": "Y",
        "investments": "Y",
        "credit_card": "Y",
        "catalog_affinity": "Y",
        "veteran_hh": "N",
        "donor_affinity": "Y"
        // ... ~108 more attributes on a real match (nulls omitted)
      },

      "property": {
        "yr_built_orig": 1987,
        "living_sqft": 2140,
        "land_sqft": 6300,
        "nmbr_bedrooms": 4,
        "tot_baths_est": 2.5,
        "full_baths": 2,
        "half_baths": 1,
        "pool": "Y",
        "owner_occupied": "Y",
        "estimated_value": 918000,
        "assess_val_prop": 742000,
        "sale_date": "2017-08-14",
        "sale_amt": 685000,
        "county_name": "San Francisco"
        // ... ~150 more property fields on a real match
      },

      "financial": {
        "discretionary_income": 38500,
        "mortgage_refinance_intent": "Y",
        "mortgage_open1st_intent": "N",
        "automotive_loan_intent": "N",
        "bank_card_intent": "Y",
        "personal_loan_intent": "N",
        "card_offer_response": "Y",
        "mortgage_offer_response": "N"
      },

      "vehicles": [
        {
          "vin": "SAMPLEVIN0000TEST",
          "make": "Toyota",
          "model": "Tundra",
          "year": 2019,
          "fuel": "Gasoline",
          "msrp": 41500,
          "body_type": "Truck",
          "class": "Mainstream",
          "drive_type": "4WD",
          "engine_cylinders": 8,
          "transmission_type": "Automatic",
          "purchase_date": "2021-03-02",
          "purchase_new": "N",
          "number_of_vehicles_in_hh": 2
          // ... full vehicle spec on a real match; up to 5 vehicles
        }
      ],

      "executive_roles": [
        {
          "company_name": "Avery Roofing Co",
          "standardized_title": "Owner",
          "executive_level": "C-Level",
          "executive_department": "Executive",
          "primary_sic_description": "Roofing Contractors",
          "location_sales_description": "$1M-$2.5M",
          "location_employee_description": "10-19",
          "bus_address_city": "San Francisco",
          "bus_address_state": "CA",
          "bus_phone": "4155550171"
          // ... ~100 more executive/business fields; up to 3 roles
        }
      ]
    }
  ]
}

The example is trimmed where marked: a real response carries ~160 demographics attributes and ~165 property fields per match, with null attributes omitted. Signed-in accounts can browse the complete field-by-field catalog on the Data catalog page.

Heads-up on size: demographics is wide; a full 100-phone batch with every group can run a few megabytes of JSON. Request only the groups you need. Groups are served from our own store; the batch cap stays 100 per request.

Need an attribute you do not see? The curated demographics set is a config choice, not a data limit. Any attribute from the full dictionary can be promoted into the API response, usually same day. Tell us which fields you need and they will be in your next call.

Error codes

Errors return a JSON body shaped like {"error": "..."} with the matching HTTP status.

StatusMeaning
400Malformed request. Body is not valid JSON, or the phone count is outside 1 to 100.
401Missing, invalid, inactive, or expired API key.
429Monthly enrichment cap reached for this key.
500Something failed on our side. Safe to retry shortly.
503The service is not fully configured. Contact us if this persists.

Rate limits

  • Up to 100 phones per request. Larger batches return 400. Split bigger jobs into multiple calls.
  • Each key can carry a monthly matched-row cap. Once you reach it, requests return 429 until the next calendar month. Only matched rows count toward the cap.
  • Need a higher cap or volume pricing? Reach out and we will size a plan to your usage.

List pulls by ZIP

Build a homeowner list programmatically instead of looking up records you already have. POST ZIPs, optional filters, and a required max_records cap; the pull runs asynchronously, the CSV is emailed to your account, and the file is downloadable over the API. The cap is a hard ceiling, and a pull is refused up front if it would exceed the records remaining on your monthly plan, so a runaway job cannot surprise you.

Queue a pull
curl -X POST https://www.talkdatatome.online/api/v1/pull   -H "X-API-Key: YOUR_KEY"   -H "Content-Type: application/json"   -d '{
    "zips": ["77066", "77069", "77070"],
    "max_records": 5000,
    "filters": {
      "min_home_value": 150000,
      "year_built_on_or_before": 2010,
      "phone_requirement": "mobile"
    }
  }'
# → 202 {"queued": true, ...}

# Poll status + get the download link:
curl https://www.talkdatatome.online/api/v1/pull -H "X-API-Key: YOUR_KEY"
# → {"orders": [{"id": "...", "status": "completed", "record_count": 5000,
#                "download_url": "/api/v1/pull/<id>/download"}]}

Filters: min_home_value, max_home_value, year_built_on_or_after, year_built_on_or_before, min_owner_age, max_owner_age, require_email, phone_requirement ("mobile", "any", or "none"). Up to 1,000 ZIPs and 100,000 records per pull; bigger jobs run managed.

Bulk appends

The batch endpoints are deliberately capped at 100 records per request: it keeps latency flat, keeps any single failure small, and lets your integration stream results as they come back. For bulk jobs, loop your file in pages of 100. A one million row append is 10,000 sequential requests and typically finishes in under an hour from a single worker; run a few workers in parallel to go faster. Your monthly cap is enforced across all of them, and only matched rows count toward it.

Bulk loop (Node)
const rows = phones; // your full list
for (let i = 0; i < rows.length; i += 100) {
  const batch = rows.slice(i, i + 100);
  const resp = await fetch("https://www.talkdatatome.online/api/v1/enrich", {
    method: "POST",
    headers: { "X-API-Key": process.env.TDTM_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({ phones: batch }),
  });
  const { results } = await resp.json();
  // append results to your output as you go
}

Prefer a one-shot file instead of an integration? Any list size can be run as a managed bulk job from your workspace: upload the file in the chat and the finished CSV is emailed to you with a download link in your History. Enterprise accounts can also hand us the file and we run it white glove.

Common recipes

Geo routing (phone to ZIP)

POST the caller’s number to /api/v1/resolve (default enrich mode) and read zip off the response, fast enough to sit inside live call routing. Route the call, then enrich the rest of the profile after connect if you want it.

Inbound call pre-qualification

Use resolve’s rtb mode: pass your filters (state, ZIP list, age range, homeowner, income floor) and get back a single pass boolean with no PII, built for bid or no-bid decisions on live calls.

Full data append (phone to PII++)

Batch up to 100 phones per call on /api/v1/enrich for name, address, demographics, email, IP, and source URL. For email or name-and-address keys instead of phones, use /api/v1/append-phone.

Realtime Resolution API · v1

Resolve a person in under 15ms

The Resolution API is the fast, single-identifier twin of the Enrichment API. Send any one identifier and get a small response back fast enough to sit inside an inbound-call routing loop. It is built for real-time bidding (RTB) pre-qualification, on-the-fly enrichment, and pixel resolution. Where /api/v1/enrich batches up to 100 phones against the warehouse, this endpoint answers a single lookup from a hot in-memory store, so it answers fast enough to sit inside a live call flow (typically a few hundred milliseconds end to end).

Under 15ms per lookup

One identifier in, a small answer out. Fast enough for the bid loop, not the batch job.

Any identifier, auto-detected

Phone, md5, sha1, or sha256. We pick the right index from the value’s shape.

Three response modes

Full enrich, a yes/no RTB pre-qual with no PII, or just the identity keys.

POST/api/v1/resolve

Authentication is identical to the Enrichment API. Send the same partner key in the X-API-Key header. A missing, invalid, inactive, or expired key returns 401.

The identifier

Send exactly one identifier as {"identifier": "..."}. We detect its kind automatically from its format, so you do not declare a type. For backward compatibility, the legacy {"phone": "..."} and {"sha256": "..."} fields are still accepted.

FormatDetected as
Phone10 digits, or 11 with a leading 1. Normalized to 10 digits.
md532 hex characters (md5 of a normalized email).
sha140 hex characters (sha1 of a normalized email).
sha25664 hex characters (sha256 of a normalized email).

Response modes

Choose what comes back with the optional mode field. The default is enrich. Any other value returns 400. On a miss every mode returns {"matched": false}. Null fields are always omitted, so a result only carries the attributes we actually hold.

mode: "enrich"default

Returns the populated PII and demographic fields for the resolved person, the same data points the batch /api/v1/enrich endpoint returns (including phones, email, IP, and source URL). Only non-null fields come back, so the example below shows a representative subset; the full set is in the table.

cURL
curl -X POST https://www.talkdatatome.online/api/v1/resolve \
  -H "X-API-Key: rk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"identifier": "4155550142"}'

Request body

{
  "identifier": "4155550142"
}

Response

{
  "matched": true,
  "first_name": "Jordan",
  "last_name": "Avery",
  "address": "1240 Oak Ridge Dr",
  "city": "San Francisco",
  "state": "CA",
  "zip": "94110",
  "age": 47,
  "income_band": "L. $150,000-$174,999",
  "income_midpoint": 162500,
  "credit_range": "A. 800+",
  "credit_midpoint": 820,
  "homeowner": "Home Owner",
  "email": "jordan.avery@example.com"
}
FieldTypeDescription
matchedbooleanWhether the identifier resolved to a person.
first_namestringGiven name on the resolved identity.
last_namestringFamily name on the resolved identity.
addressstringStandardized street address.
citystringStandardized city.
statestringTwo-letter state code.
zipstringFive-digit ZIP code.
agenumberEstimated age.
genderstringGender on file.
marital_statusstringMarital status on file.
income_bandstringHousehold income band label, e.g. "L. $150,000-$174,999".
income_midpointnumberNumeric household income midpoint, in dollars.
credit_rangestringCredit range label, e.g. "A. 800+".
credit_midpointnumberNumeric credit-score midpoint.
homeownerstringHome ownership status: "Home Owner", "Renter", or "Probable Home Owner".
home_valuenumberEstimated home value, in dollars.
household_sizenumberNumber of people in the household.
birth_month_and_yearstringBirth month and year on file, e.g. "1977-04".
year_builtnumberYear the residence was built.
dncnumberDo Not Call state of the returned mobile. 0 means callable (the served mobile is DNC-clean by construction).
mobile_phonestringBest deliverable mobile number on the identity.
landline_phonestringBest landline on the identity.
emailstringBest email on the identity.
ipstringIP address associated with the identity.
source_urlstringOpt-in or lead source URL on the identity.
mode: "rtb"pre-qualification, no PII

For real-time bidding. Send the identifier plus pre-qual filters and get back only {"matched", "pass"}, never any PII. Filters can sit at the top level or under a filters object. Every filter you send must pass, and a filter referencing a field the profile does not carry fails (we will not assert a qualification we have no data for). A miss, or any failed filter, returns "pass": false.

cURL
curl -X POST https://www.talkdatatome.online/api/v1/resolve \
  -H "X-API-Key: rk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "identifier": "4155550142",
    "mode": "rtb",
    "state": "CA",
    "age_min": 35,
    "income_min": 100000,
    "homeowner": true
  }'

Request body

{
  "identifier": "4155550142",
  "mode": "rtb",
  "state": "CA",
  "age_min": 35,
  "income_min": 100000,
  "homeowner": true
}

Response

{
  "matched": true,
  "pass": true
}

Pre-qual filters (all optional)

FieldTypeDescription
zipstringProfile ZIP must match these five digits exactly.
statestringProfile state must match this two-letter code (case-insensitive).
age_minnumberProfile age must be at least this value.
age_maxnumberProfile age must be at most this value.
income_minnumberIncome midpoint must be at least this many dollars.
credit_minnumberCredit midpoint must be at least this value.
homeownerbooleanWhen true, the profile must be a (probable) homeowner.
mode: "identity"identity keys only

Returns only the identity keys for the resolved person (hashes, IP, source URL, and registration date), with no demographics. Useful for pixel resolution and identity stitching. Only non-null fields come back.

cURL
curl -X POST https://www.talkdatatome.online/api/v1/resolve \
  -H "X-API-Key: rk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "identifier": "5d41402abc4b2a76b9719d911017c592",
    "mode": "identity"
  }'

Request body

{
  "identifier": "5d41402abc4b2a76b9719d911017c592",
  "mode": "identity"
}

Response

{
  "matched": true,
  "md5": "5d41402abc4b2a76b9719d911017c592",
  "sha256": "9b2c…e4f1",
  "ip": "73.92.18.204",
  "source_url": "homeimprovementquotes.com",
  "registration_date": "2024-11-03"
}
FieldTypeDescription
matchedbooleanWhether the identifier resolved to a person.
md5stringmd5 of the normalized email on the identity.
sha256stringsha256 of the normalized email on the identity.
ipstringIP address associated with the identity.
source_urlstringOpt-in or lead source URL on the identity.
registration_datestringRegistration date on the source record.

Error codes

Errors return a JSON body shaped like {"error": "..."} with the matching HTTP status. Note there is no rate-cap status here: a miss is a normal 200 with "matched": false.

StatusMeaning
400Body is not valid JSON, the mode is unknown, or no valid identifier was supplied.
401Missing, invalid, inactive, or expired API key.
503The backend is not configured. Contact us if this persists.
Phone Append API

Append phones from an email or a mailing address

The reverse of the Enrichment API. Send up to 100 plaintext emails and/or up to 100 name-and-address records per call, and get back each person's phones (best number flagged), plus their name and postal address. Built for CRM phone-fill and outreach list preparation. Plan for 1 to 3 seconds per batch.

POST/api/v1/append-phone

Authentication is identical to the other endpoints: send your partner key in the X-API-Key header. Emails must be plaintext (we hash them server-side to hit the index; a pre-hashed value cannot be converted, so it will not match). Records match through the postal graph first; when only the record's email matches, a last-name gate keeps us from returning a different person, and a same-surname, different-first-name match comes back flagged at low confidence. We log match counts only: the emails you submit and the phones we return are never persisted.

cURL (emails)
curl -X POST https://www.talkdatatome.online/api/v1/append-phone \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_KEY" \
  -d '{"emails": ["jane.doe@example.com"]}'
Request body (records)
{
  "records": [
    {
      "first_name": "Jane",
      "last_name": "Doe",
      "address": "123 Main St",
      "city": "Tampa",
      "state": "FL",
      "zip": "33601",
      "email": "jane.doe@example.com"
    }
  ]
}
Response
{
  "requested": 1,
  "matched": 1,
  "results": [
    {
      "input": "jane.doe@example.com",
      "matched": true,
      "confidence": "medium",
      "first_name": "JANE",
      "last_name": "DOE",
      "address": "123 MAIN ST",
      "city": "TAMPA",
      "state": "FL",
      "zip": "33601",
      "phones": [
        { "phone": "8135550142", "type": "mobile", "rank": 1, "carrier": "T-MOBILE",
          "last_seen": "2026-04-18", "dnc": "callable", "best": true },
        { "phone": "8135550177", "type": "landline", "rank": 1, "carrier": null,
          "last_seen": "2025-11-02", "dnc": "callable", "best": false }
      ]
    }
  ]
}

Result fields

Email inputs come back in results (same order as submitted). Record inputs come back in record_results, each echoing the record you sent. A miss is a normal 200 with "matched": false.

FieldTypeDescription
inputstringThe email you submitted, echoed back (record results echo the record fields instead).
matchedbooleanWhether the input resolved to a person with at least one phone.
confidencestring"medium" or "low". Low means treat with care (for example, the match may be another member of the same household).
first_namestringGiven name on the matched identity. Null on a miss.
last_namestringFamily name on the matched identity. Null on a miss.
addressstringStreet address on the matched identity.
citystringCity on the matched identity.
statestringTwo-letter state code.
zipstringZIP code.
phonesarrayEvery phone on the identity, ordered best-first. Empty on a miss.

Each entry in phones

FieldTypeDescription
phonestringTen-digit phone number.
typestring"mobile", "landline", or "voip".
ranknumberPosition within its tier (lower is fresher/stronger).
carrierstringCarrier name when known, else null.
last_seenstringDate this number was last confirmed active for the person.
dncstring"callable" or "DNC" (on the national Do Not Call registry).
bestbooleanTrue on exactly one phone per match: the single number to dial first.

Error codes

StatusMeaning
400Malformed request. Body is not valid JSON, no inputs given, or more than 100 emails / 100 records.
401Missing, invalid, inactive, or expired API key.
429Monthly matched-row cap reached for this key.
500Something failed on our side. Safe to retry shortly.

Ready to start enriching?

Create your key on the Developers page and make your first call in minutes. Need a higher cap or volume pricing? Talk to us.