Search by task, endpoint, field, or error.
API 2.0.0
Simpler defaults. Detail when you need it.
Core responses focus on the common task, with optional detail in deep. Review field moves, renamed fields, removals and plan requirements before changing your team’s version.
What changes
Country, State, City and District profilesBreaking change
Location and identity stay in core. Population, area and the other statistical, regional and technical profile fields move into paid-plan deep. Country’s alternate identifiers and formal-name metadata move there too. Details previously returned in core are no longer included in a Free response.
country.population
state.area
city.elevation
district.population// Request ?deep=true on a paid plan
country.deep.population
state.deep.area
city.deep.elevation
district.deep.populationPostal keeps the address context in coreBreaking change
Postal identity, place names, coordinates and timezone stay in core. Elevation, population, area, currency, tax fields, neighbors and metros move into paid-plan deep. Tax field names stay flat inside that bag. Neighbors remains an array of postal-code strings.
postal.population
postal.tax_rate
postal.neighbors
postal.metros// Request ?deep=true on a paid plan
postal.deep.population
postal.deep.tax_rate
postal.deep.neighbors
postal.deep.metrosCollection detail belongs to each placeBreaking change
City search and nearby results put optional profiles in each city’s deep. State district lists put population in each district’s deep. Postal nearby puts metros in the origin’s deep and each result’s deep; Postal distance puts them in from.deep and to.deep. These profiles require paid deep. Distances and lookup context remain core; there is no extra charge per result.
cities[0].population
districts[0].population
from.metros// Request ?deep=true on a paid plan
cities[0].deep.population
districts[0].deep.population
from.deep.metrosPopulation periods and property-tax context
Population has a nullable population_period in Continent core and the paid geography profiles, including State district-list detail. Full US Postal and District paid deep add nullable property_tax with annual_median, currency and period: median annual tax on owner-occupied housing for the ZIP area or county, not an individual property bill. Compact nearby/distance responses do not include it. Missing observations stay null.
continent.population_period
postal.deep.population_period
postal.deep.property_tax // { annual_median, currency, period } or nullLocal display names use name_localBreaking change
Country, State, City, Language, Holiday and Point’s city record rename local_name to name_local. The value is null when absent or identical to the primary name. Use name_local ?? name for display. Postal keeps city_local, state_name_local and district_name_local.
place.local_name ?? place.name
holiday.local_name ?? holiday.nameplace.name_local ?? place.name
holiday.name_local ?? holiday.namePoint answers the location directlyBreaking change
The timezone identifier moves to core and is determined at the input coordinates. Elevation, elevation_ft and resolution move to deep, included on every plan. The full nested time response is removed; deep.city becomes compact nearest-city context, not a full City profile. Use Time or City for those separate answers.
point.elevation
point.deep.timezone.timezone
point.deep.city.populationpoint.timezone
point.deep.elevation // ?deep=true, every plan
// Read a full city profile through /city with its own deep optionPhone area context moves into deepBreaking change
Parsing, validity, country, type and national/international formatting stay in core. State, state_name and timezone move into deep, included on every plan. The timezone still describes the numbering area, not the handset’s location.
phone.state
phone.state_name
phone.timezone// Request ?deep=true
phone.deep.state
phone.deep.state_name
phone.deep.timezoneCarrier place detail is optionalBreaking change
Carrier, line type and burner classification stay in core. City, state and state_name move to deep. Requesting that detail uses the same Carrier unit, including a Free allowance unit; it does not make another lookup or add a paid-plan gate.
carrier.city
carrier.state
carrier.state_name// Request ?deep=true; same Carrier unit
carrier.deep.city
carrier.deep.state
carrier.deep.state_nameHLR separates the verdict from network detailBreaking change
Core is phone, valid, country, live and connected. Roaming, roaming_network, roaming_country, network, original_network, mcc and mnc move to deep, included in the same HLR unit on every plan. Public checked_at is removed entirely. Verdict meanings and reuse behavior remain unchanged.
hlr.network
hlr.mcc
hlr.checked_at// Request ?deep=true; same HLR unit
hlr.deep.network
hlr.deep.mcc
// checked_at is no longer returnedName separates parsing from name evidenceBreaking change
Gender and salutation move to paid deep alongside known and countries; expanded name evidence can change their values. Optional country must be two letters and affects evidence only, not parsing or the returned country list. A known name can have null gender; an exact compound’s null result does not borrow its first token’s gender. Single Han/Hangul names and leading-apostrophe spellings are now accepted, and display-direction controls are removed. Unknown names are distinct from an unavailable evidence lookup: the latter returns 503 for paid deep while core parsing remains available. Country associations do not establish nationality.
name.gender
name.salutation// Request ?deep=true on a paid plan
name.deep.gender
name.deep.salutation
name.deep.known
name.deep.countriesEmail verification omits the public timestampBreaking change
Populated verification deep contains deliverable and catchall. The public deep.checked_at field is removed. Core email parsing and classification, verification billing and reuse behavior retain their existing purpose.
email.deep.deliverable
email.deep.catchall
email.deep.checked_atemail.deep.deliverable
email.deep.catchall
// deep.checked_at is no longer returnedDomain focuses on registrationBreaking change
Domain core remains domain and available. Paid deep contains registration only. The former a, aaaa, ns, mx, txt and mailhost fields are removed from Domain deep. Use DNS for records and MX for mail routing. Registration checks that cannot establish availability return null.
domain.deep.registration
domain.deep.mx
domain.deep.mailhostdomain.deep.registration
// Use /dns/{domain} for records
// Use /mx/{domain} for mail routingExisting Company integrations get business detailBreaking change
Core keeps registration identity and address. Activity, state_name, country_name, vat, gst, acn, siren, siege, kind and invoice move to paid deep. The old deep.country, deep.postal and deep.city records are removed entirely. Use the dedicated geography APIs for those records; adding deep does not restore the embedded responses.
company.activity
company.vat
company.deep.country
company.deep.postal
company.deep.city// Request ?deep=true on a paid plan
company.deep.activity
company.deep.vat
// Read related places through their dedicated APIsVIN specifications move into paid deepBreaking change
VIN, validity, year, make, model, trim, body and type stay in core. Series, doors, cylinders, displacement, fuel, horsepower, drive, transmission, manufacturer, plant location and gvwr join recalls in paid deep. A Free response no longer includes those former core specifications.
vin.doors
vin.fuel
vin.manufacturer// Request ?deep=true on a paid plan
vin.deep.doors
vin.deep.fuel
vin.deep.manufacturerNPI keeps provider identity and status in coreBreaking change
Provider identity, credentials, specialty, practice contact, active status and excluded remain core. Deactivated_at moves into the existing paid Medicare/enrollment deep bag. An exclusion value of false remains a limited lookup result, not a clearance.
npi.deactivated_at
npi.excludednpi.deep.deactivated_at // ?deep=true on a paid plan
npi.excludedIBAN keeps bank identity in coreBreaking change
The normalized IBAN, validity, country, formatted value, bank, bank_name and bic remain core. Checksum digits, branch and account structure move to deep, included on every plan. The validity check still runs without deep.
iban.checksum
iban.branch
iban.account// Request ?deep=true
iban.deep.checksum
iban.deep.branch
iban.deep.accountTariff separates the base answer from schedule detailBreaking change
Code, description, lineage, general duty and revision remain core. Units, special and other move into paid deep. Deep can now return schedule detail without origin; origin-dependent effective_rate and measures remain null until origin is supplied. Conditional rates are not turned into an invented single percentage.
tariff.units
tariff.special
tariff.other// Request ?deep=true on a paid plan
tariff.deep.units
tariff.deep.special
tariff.deep.otherDate returns normalization firstBreaking change
Core is date, valid and unix. Year, month, weekday, week, week_year, quarter, leap and the other calendar facts move to deep, included on every plan. A requested date distance still returns to and days in core; it does not require deep.
date.year
date.weekday
date.week_year// Request ?deep=true
date.deep.year
date.deep.weekday
date.deep.week_yearCurrency and Language keep display facts in coreBreaking change
Currency keeps code, name, symbol, symbol_native and digits; numeric, name_plural and countries move to deep. Language keeps code, names, script and direction; iso3 and countries move to deep. Both detail bags are included on every plan. Currency conversion is unchanged.
currency.numeric
currency.countries
language.iso3// Request ?deep=true
currency.deep.numeric
currency.deep.countries
language.deep.iso3Emoji encoding and variants move togetherBreaking change
Emoji, name, shortcodes and category stay in core. Codepoints, hex, status, version, keywords and the complete skins array move to deep, included on every plan. Search uses the same projection for each result; read that result’s deep rather than expecting one shared bag.
emoji.codepoints
emoji.skins
results[0].keywords// Request ?deep=true
emoji.deep.codepoints
emoji.deep.skins
results[0].deep.keywordsWeather keeps current conditions and station contextBreaking change
Dewpoint, wind gust, pressure and visibility, with their paired units, move from current to paid deep.current. Temperature, feels-like, humidity, wind speed/direction, conditions, observed_at and station remain core. The public source object is removed entirely; required attribution remains available.
weather.current.pressure
weather.current.wind_gust
weather.source// Request ?deep=true on a paid plan
weather.deep.current.pressure
weather.deep.current.wind_gust
// source is no longer returnedTimezone gains a complete clock answerBreaking change
Existing /timezone lookups in 2.0.0 return timezone, at, unix, offset, abbreviation and dst in core. Name, numeric offsets and next_dst belong in deep, included on every plan. Converted targets include the same instant as at and unix, with display detail in to.deep. The new /time route uses this contract on both supported API versions.
timezone.name
timezone.offset_minutes
timezone.next_dst// Request ?deep=true
timezone.at
timezone.unix
timezone.deep.name
timezone.deep.offset_minutes
timezone.deep.next_dstTimezone validates dates and preserves exact offsetsBreaking change
The 2.0.0 /timezone contract rejects impossible calendar dates and non-ISO at values; use two-digit hours and UTC years 0001 through 9999. Historical offsets can include seconds: deep.offset_minutes truncates toward zero, while deep.offset_seconds preserves the exact value. Coordinate lookups now honor and validate to. DST follows the zone’s actual rule, including negative seasonal adjustments. A repeated local time chooses the earlier instant unless an explicit offset identifies the later one; skipped local times resolve forward by the gap.
at=2026-02-29 // could normalize to another date
at=3/4/2026 // permissive date parsingat=2026-02-28T12:00:00Z // valid ISO input
// Impossible dates and non-ISO values return invalid_requestAddress autocomplete explains empty resultsBreaking change
Autocomplete adds a nullable reason: more_input, missing_context, no_matches or null, and echoes an explicit country. Treat reason as an open string and use it as a hint. Unavailable search data or a service failure returns service_unavailable with HTTP 503 rather than looking like a successful empty search. Handle that error separately from an honest no-match response.
// An empty suggestions list could also hide a service failure// Successful empty search: inspect reason
// Service failure: handle HTTP 503 / service_unavailableNew depth controls validate their inputBreaking change
Carrier, HLR, Country lookup, State lookup/district lists, District, City lookup/search/ID/nearby and Postal distance/nearby now accept only literal deep=true. A formerly ignored deep=false on those operations returns 400; omit deep for core. This is operation-specific: Currency, Emoji and Language still accept false, while Phone, Date, Point, full Postal and Timezone already enforced true-only.
// On the newly validated operations
?deep=false // ignored?deep=true // request detail
// Omit deep for core; deep=false returns HTTP 400 on these operationsAPI 2.0.0 is available as an explicit team upgrade.
One API version applies to every key and connected app in your team. Existing teams keep 1.0.0 until an owner or admin changes the setting; new and replacement keys inherit the team version.
Keep your keys, lookup URLs and authentication headers. A major upgrade can still require changing the code that reads response fields. Test every affected integration before changing the team setting.
Request optional detail with ?deep=true and omit the parameter for core. Check each operation’s accepted query values. Without a paid entitlement, requested plan deep is an empty object; adding deep does not restore every formerly Free field. Detail values can remain null.
SDK package versions are separate from API versions. SDK/MCP 0.4.0 targets API 2.0.0; 0.3.2 targets API 1.0.0. Installing a package does not change your team’s setting.
The before/after snippets illustrate field access, not complete responses. Review the matching endpoint reference for every field and operation you use.