Search

1 token per request

Search for states, Census places, counties, PLSS townships, PLSS sections, addresses, and parcels across the United States. Supports no-types search, fuzzy matching, address geocoding, parcel ID lookups, and zoom-to-result metadata.

Try search

Live search demo against the production API. Example buttons fill the query and may set a types or region filter — when they do, the filter shows up as a chip below the form and is included in the next search. Clear chips to run unfiltered. The exact request URL is previewed so you can see what the API receives. Parcel IDs require a region — pass region (state code), bbox, or lat/lng.

GET https://api.landmapmagic.com/v1/data/search?key=YOUR_API_KEY&q=&limit=8
GEThttps://api.landmapmagic.com/v1/data/search

Parameters

Parameters

NameTypeDescription
key*stringYour API key for authentication.
q*stringSearch query string. Minimum 2 characters. Supports state, city/place, county, PLSS, address, parcel ID, and fuzzy matching queries.
limitnumberMaximum number of results to return. Range: 1-50. Default: 10.
typesstringComma-separated list of result types to filter by. Valid values: state, place, county, plss_township, plss_section, address, parcel. Omit to search all types.
regionstringState or region code (e.g. "IA", "Iowa") to narrow search scope. Required for parcel ID searches unless lat/lng, bbox, or center_lat/center_lng is provided.
latnumberLatitude for geographic biasing. Used to boost results near this location and as fallback region context for parcel ID searches.
lngnumberLongitude for geographic biasing. Must be provided together with lat.
bboxstringBounding box to constrain results. Format: min_lon,min_lat,max_lon,max_lat. Can span up to 5 states for multi-state searches.
center_latnumberFallback center latitude for region inference when lat/lng and bbox are not provided. Used primarily for parcel ID lookups.
center_lngnumberFallback center longitude for region inference. Must be provided together with center_lat.

Notes

Omit types for blended search. The unfiltered path searches states, places, counties, PLSS, parcels, and addresses together. Set types only to force a narrower mode.
Parcel ID search needs a region. You must pass one of: region (state code), bbox, or lat + lng. Without it the parcel branch returns nothing.
bbox parcel search is capped at 5 states. A bbox that intersects more than 5 states will be rejected — narrow the box or pass region explicitly.

Response Fields

Top-Level Fields

AttributeTypeDescription
querystringThe original search query string.
resultsarrayArray of matching result objects.
total_resultsnumberNumber of results returned after limit and ranking are applied.
query_interpretationobjectDebug-friendly interpretation of the query, including normalized text, inferred types, and parsed PLSS data when applicable.
debug_timingobjectOptional timing breakdown returned when debug_timing=1 or x-debug-timing=1 is provided.

Result Object Fields

AttributeTypeDescription
idstringUnique identifier for the result (e.g. FIPS code, PLSS ID, parcel ID).
typestringEntity type: state, place, county, plss_township, plss_section, address, or parcel.
namestringDisplay name of the result (e.g. "Story County, Iowa").
simple_namestringSimplified short name without state qualifier (e.g. "Story County").
display_namestringConvenience label for the primary result text. Backed by structured fields so clients can render their own labels.
context_textstringConvenience secondary label, such as county/state context.
formatted_labelstringConvenience combined label for simple clients.
contextobjectStructured ancestor context for custom labels: state, county, township, and PLSS data where applicable. This replaces older flat fields like state, countyName, townshipLabel, and top-level plss.
centroid[number, number]Geographic center of the result as [longitude, latitude].
bbox[number, number, number, number]Bounding box as [min_lon, min_lat, max_lon, max_lat].
suggested_zoomnumberRecommended map zoom level for viewing this result.
scorenumberRelevance score from 0 to 1, where 1 is an exact match.
parcelobjectParcel details (only for type=parcel). Contains parcel_id, owner, acreage, market_value, and land_use_class.
regionstringRegion or state context used for the search.

Context Object

AttributeTypeDescription
stateobjectState context with abbr, name, and two-digit FIPS code.
countyobjectCounty context with five-digit FIPS, display name, and simple_name without the County suffix when available.
townshipobjectPLSS township context with id, name, and display label when applicable.
plssobjectPLSS components with state_fips, meridian, town_num, town_dir, range_num, range_dir, and section.

Context PLSS Object

AttributeTypeDescription
state_fipsstringTwo-digit state FIPS code associated with the PLSS result.
meridianstringPLSS meridian identifier when available.
town_numnumberTownship number.
town_dirstringTownship direction, usually N or S.
range_numnumberRange number.
range_dirstringRange direction, usually E or W.
sectionnumberSection number for plss_section results, or 0 when not applicable.

Parcel Object

AttributeTypeDescription
parcel_idstringThe parcel identification number.
ownerstringRecorded owner name.
acreagenumberTotal parcel acreage.
market_valuenumberAssessed market value in USD.
land_use_classstringLand use classification (e.g. "Agricultural", "Residential").

Code Examples

Basic Search

cURL
curl "https://api.landmapmagic.com/v1/data/search?key=YOUR_API_KEY&q=iowa&limit=5"
JavaScript
const response = await fetch(
  "https://api.landmapmagic.com/v1/data/search?" +
    new URLSearchParams({
      key: "YOUR_API_KEY",
      q: "iowa",
      limit: "5",
    })
);
const data = await response.json();
console.log(data.results);
Python
import requests

response = requests.get(
    "https://api.landmapmagic.com/v1/data/search",
    params={
        "key": "YOUR_API_KEY",
        "q": "iowa",
        "limit": 5,
    },
)
data = response.json()
print(data["results"])

No-Types Place Search

cURL
curl "https://api.landmapmagic.com/v1/data/search?key=YOUR_API_KEY&q=Ames+Iowa&limit=5"
JavaScript
const response = await fetch(
  "https://api.landmapmagic.com/v1/data/search?" +
    new URLSearchParams({
      key: "YOUR_API_KEY",
      q: "Ames Iowa",
      limit: "5",
    })
);
const data = await response.json();
const result = data.results[0];

console.log(result.display_name);
console.log(result.context.state.abbr, result.context.county.name);
console.log(result.centroid, result.suggested_zoom);
Python
import requests

response = requests.get(
    "https://api.landmapmagic.com/v1/data/search",
    params={
        "key": "YOUR_API_KEY",
        "q": "Ames Iowa",
        "limit": 5,
    },
)
data = response.json()
result = data["results"][0]
print(result["display_name"])
print(result["context"]["state"]["abbr"], result["context"]["county"]["name"])

PLSS Search

cURL
curl "https://api.landmapmagic.com/v1/data/search?key=YOUR_API_KEY&q=24-100N-40W&limit=5"
JavaScript
const response = await fetch(
  "https://api.landmapmagic.com/v1/data/search?" +
    new URLSearchParams({
      key: "YOUR_API_KEY",
      q: "24-100N-40W",
      limit: "5",
    })
);
const data = await response.json();
const result = data.results[0];
const { township, plss, county, state } = result.context;

console.log(township.label, plss.section);
console.log(county.name, state.name);
Python
import requests

response = requests.get(
    "https://api.landmapmagic.com/v1/data/search",
    params={
        "key": "YOUR_API_KEY",
        "q": "24-100N-40W",
        "limit": 5,
    },
)
data = response.json()
context = data["results"][0]["context"]
print(context["township"]["label"], context["plss"]["section"])
print(context["county"]["name"], context["state"]["name"])

Address Search

cURL
curl "https://api.landmapmagic.com/v1/data/search?key=YOUR_API_KEY&q=1600+Pennsylvania+Ave+Washington+DC&types=address&limit=1"
JavaScript
const response = await fetch(
  "https://api.landmapmagic.com/v1/data/search?" +
    new URLSearchParams({
      key: "YOUR_API_KEY",
      q: "1600 Pennsylvania Ave Washington DC",
      types: "address",
      limit: "1",
    })
);
const data = await response.json();
const { centroid, suggested_zoom } = data.results[0];
console.log("Center:", centroid, "Zoom:", suggested_zoom);
Python
import requests

response = requests.get(
    "https://api.landmapmagic.com/v1/data/search",
    params={
        "key": "YOUR_API_KEY",
        "q": "1600 Pennsylvania Ave Washington DC",
        "types": "address",
        "limit": 1,
    },
)
data = response.json()
result = data["results"][0]
print(f"Center: {result['centroid']}, Zoom: {result['suggested_zoom']}")

Parcel Search with Region

cURL
curl "https://api.landmapmagic.com/v1/data/search?key=YOUR_API_KEY&q=12-34-567-890&types=parcel&region=IA"
JavaScript
const response = await fetch(
  "https://api.landmapmagic.com/v1/data/search?" +
    new URLSearchParams({
      key: "YOUR_API_KEY",
      q: "12-34-567-890",
      types: "parcel",
      region: "IA",
    })
);
const data = await response.json();
const parcel = data.results[0]?.parcel;
console.log("Owner:", parcel?.owner, "Acres:", parcel?.acreage);
Python
import requests

response = requests.get(
    "https://api.landmapmagic.com/v1/data/search",
    params={
        "key": "YOUR_API_KEY",
        "q": "12-34-567-890",
        "types": "parcel",
        "region": "IA",
    },
)
data = response.json()
parcel = data["results"][0].get("parcel", {})
print(f"Owner: {parcel.get('owner')}, Acres: {parcel.get('acreage')}")

Parcel Search with Lat/Lng

cURL
curl "https://api.landmapmagic.com/v1/data/search?key=YOUR_API_KEY&q=12-34-567-890&types=parcel&lat=42.0308&lng=-93.4816"
JavaScript
const response = await fetch(
  "https://api.landmapmagic.com/v1/data/search?" +
    new URLSearchParams({
      key: "YOUR_API_KEY",
      q: "12-34-567-890",
      types: "parcel",
      lat: "42.0308",
      lng: "-93.4816",
    })
);
const data = await response.json();
console.log(data.results);
Python
import requests

response = requests.get(
    "https://api.landmapmagic.com/v1/data/search",
    params={
        "key": "YOUR_API_KEY",
        "q": "12-34-567-890",
        "types": "parcel",
        "lat": 42.0308,
        "lng": -93.4816,
    },
)
data = response.json()
print(data["results"])

Response Examples

No-Types Place Search — "Ames Iowa"

{
  "query": "Ames Iowa",
  "total_results": 1,
  "query_interpretation": {
    "normalized": "ames iowa",
    "parsed_plss": null,
    "inferred_types": []
  },
  "results": [
    {
      "id": "place:19:02850",
      "type": "place",
      "name": "Ames",
      "simple_name": "Ames",
      "display_name": "Ames",
      "context_text": "Story County, Iowa",
      "formatted_label": "Ames Story County, Iowa",
      "context": {
        "state": { "abbr": "IA", "name": "Iowa", "fips": "19" },
        "county": { "fips": "19169", "name": "Story County", "simple_name": "Story" },
        "township": { "id": "", "name": "", "label": "" },
        "plss": { "state_fips": "19", "meridian": "", "town_num": 0, "town_dir": "", "range_num": 0, "range_dir": "", "section": 0 }
      },
      "centroid": [-93.6199, 42.0308],
      "bbox": [-93.68, 42.00, -93.56, 42.06],
      "suggested_zoom": 12,
      "score": 1.2,
      "match": { "source": "postgres", "alias": "ames iowa", "kind": "exact" }
    }
  ]
}

PLSS Section Search — "24-100N-40W"

{
  "query": "24-100N-40W",
  "total_results": 1,
  "query_interpretation": {
    "normalized": "24 100n 40w",
    "parsed_plss": {
      "kind": "section",
      "section": 24,
      "town_num": 100,
      "town_dir": "N",
      "range_num": 40,
      "range_dir": "W"
    },
    "inferred_types": ["plss_section"]
  },
  "results": [
    {
      "id": "plss_section:...",
      "type": "plss_section",
      "name": "24-100N-40W",
      "simple_name": "24-100N-40W",
      "display_name": "Section 24, T100N R40W",
      "context_text": "Osceola County, Iowa",
      "formatted_label": "Section 24, T100N R40W Osceola County, Iowa",
      "context": {
        "state": { "abbr": "IA", "name": "Iowa", "fips": "19" },
        "county": { "fips": "19143", "name": "Osceola County", "simple_name": "Osceola" },
        "township": { "id": "plss_township:...", "name": "100N-40W", "label": "100N-40W" },
        "plss": { "state_fips": "19", "meridian": "5th Principal", "town_num": 100, "town_dir": "N", "range_num": 40, "range_dir": "W", "section": 24 }
      },
      "centroid": [-95.8, 43.4],
      "bbox": [-95.82, 43.39, -95.79, 43.41],
      "suggested_zoom": 14,
      "score": 1.45,
      "match": { "source": "postgres", "alias": "", "kind": "plss_numeric" }
    }
  ]
}

Parcel ID Search

{
  "query": "12-34-567-890",
  "total_results": 1,
  "results": [
    {
      "id": "parcel-19169-1234567890",
      "type": "parcel",
      "name": "Parcel 12-34-567-890, Story County, Iowa",
      "simple_name": "12-34-567-890",
      "context": {
        "state": { "abbr": "IA", "name": "Iowa", "fips": "19" },
        "county": { "fips": "19169", "name": "Story County", "simple_name": "Story" },
        "township": { "id": "", "name": "", "label": "" },
        "plss": { "state_fips": "19", "meridian": "", "town_num": 0, "town_dir": "", "range_num": 0, "range_dir": "", "section": 0 }
      },
      "centroid": [-93.4621, 42.0142],
      "bbox": [-93.4688, 42.0098, -93.4554, 42.0186],
      "suggested_zoom": 16,
      "score": 0.98,
      "match": { "source": "reportall", "alias": "12-34-567-890", "kind": "parcel" },
      "parcel": {
        "parcel_id": "12-34-567-890",
        "owner": "SMITH JOHN A",
        "acreage": 152.4,
        "market_value": 1280000,
        "land_use_class": "Agricultural"
      },
      "region": "IA"
    }
  ]
}