Filter parcels by criteria
const url = 'https://app-api.landinsights.co/api/public/v1/properties/filter/';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"counties":[8023],"acres_min":1,"acres_max":10,"structure_count_max":0}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://app-api.landinsights.co/api/public/v1/properties/filter/ \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "counties": [ 8023 ], "acres_min": 1, "acres_max": 10, "structure_count_max": 0 }'Search parcels using a curated subset of the in-app parcel filter. POST body is the filter spec (see PublicParcelFilterRequest).
At least one of county, counties, zips_include, or geom_intersects is required to scope the search.
Returns a paginated envelope: count (total matches), next / previous (page URLs or null), and results (one summary per parcel).
Cost: 30 tokens per search. Empty results (count = 0) cost 0 tokens.
Authorizations
Section titled “Authorizations ”Request Body
Section titled “Request Body ”The in-app parcel filter exposed on the public API.
Mirrors the private parcel-search filter set, minus the options that are export settings (which cost credits) rather than parcel filters — i.e. no deduplication, skip tracing, SellerIQ lead scoring, AI market valuation, or KML generation.
All fields are optional individually, but at least one scope filter must
be present: county, counties, zips_include, geom_intersects, or
owner_parcel_id. Range filters use <name>_min / <name>_max pairs;
either bound may be supplied on its own.
object
WKT geometry (e.g. a polygon) — restrict to parcels intersecting it. A valid scope filter on its own.
Single 5-digit county FIPS to restrict to.
List of 5-digit county FIPS codes (OR-ed).
Two-letter US state code.
Restrict to parcels in these 5-digit ZIP codes.
Exclude parcels in these 5-digit ZIP codes.
Assessor’s Parcel Number (normalized, exact match).
Land Insights numeric parcel identifier.
List of subdivision names to include (OR-ed).
List of zoning codes to include (OR-ed). County-specific values.
List of land-use codes to include (OR-ed).
Restrict to a single school-district name.
Minimum parcel acreage (inclusive).
Maximum parcel acreage (inclusive).
Minimum total building square footage.
Maximum total building square footage.
Minimum number of structures on the parcel.
Maximum number of structures on the parcel.
Earliest year built for any structure.
Latest year built for any structure.
Minimum improvement value as a percentage of total value.
Maximum improvement value as a percentage of total value.
Minimum assessed total value, in whole US dollars.
Maximum assessed total value, in whole US dollars.
Minimum assessed land value, in whole US dollars.
Maximum assessed land value, in whole US dollars.
Minimum assessed improvement value, in whole US dollars.
Maximum assessed improvement value, in whole US dollars.
Minimum assessor market total value, in whole USD.
Maximum assessor market total value, in whole USD.
Minimum assessor market land value, in whole USD.
Maximum assessor market land value, in whole USD.
Minimum assessor market improvement value, in whole USD.
Maximum assessor market improvement value, in whole USD.
Only return parcels delinquent since at least this many years ago (e.g. 2 → delinquent since 2 or more years ago).
If true, only return parcels currently flagged as tax-delinquent.
Minimum most-recent sale price, in whole USD.
Maximum most-recent sale price, in whole USD.
List of sale-price codes to include (OR-ed).
Earliest most-recent-sale recording date (YYYYMMDD).
Latest most-recent-sale recording date (YYYYMMDD).
Match parcels whose most-recent seller name contains any of these.
List of deed/document-type codes to include (OR-ed).
Minimum first-mortgage loan amount, in whole USD.
Maximum first-mortgage loan amount, in whole USD.
Earliest first-mortgage recording date (YYYYMMDD).
Latest first-mortgage recording date (YYYYMMDD).
List of first-mortgage financing-type codes to include (OR-ed).
List of first-mortgage loan-type codes to include (OR-ed).
Minimum first-mortgage interest rate (%).
Maximum first-mortgage interest rate (%).
If true, only return parcels whose owner’s mailing address is in a different state than the parcel.
If true, only return parcels whose owner’s mailing address is in a different county than the parcel.
If true, only return parcels whose owner’s mailing ZIP differs from the parcel’s.
If true, exclude parcels owned by corporate entities (LLCs, INC, etc.).
If true, exclude parcels owned by Homeowners Associations.
‘Y’ for owner-occupied only; ‘N’ for non-owner-occupied (excludes ‘Y’).
Minimum ownership length, in months (since last recording).
Maximum ownership length, in months.
If true, only parcels whose last transfer was inter-family.
Exclude parcels whose owner name contains any of these words.
Only parcels whose owner name contains any of these words.
Exact match on the primary owner’s full name.
Exact match on the secondary owner’s full name.
Return the owner portfolio for this parcel — every parcel sharing its owner’s mailing address. A valid scope filter on its own.
If true, only parcels that appear vacant (no detected structure).
If true, exclude parcels that are predominantly steeply sloped.
If true, exclude landlocked parcels.
If true, only return landlocked parcels.
Maximum allowed percentage of parcel area overlapping wetlands.
Maximum allowed percentage of parcel area within a flood zone.
Minimum road frontage, in feet.
Maximum road frontage, in feet.
When measuring road frontage, count major-highway frontage.
When measuring road frontage, count normal-road frontage.
When measuring road frontage, count local-road frontage.
Slope-category index (0–10); paired with slope_area_percent to cap the share of parcel area steeper than this category.
Maximum percentage of parcel area allowed to be steeper than slope_area_index.
Examples
Vacant 1–10 acre parcels in a rural county
{ "counties": [ 8023 ], "acres_min": 1, "acres_max": 10, "structure_count_max": 0}Out-of-state owners, larger acreage
{ "counties": [ "35029", "48229" ], "acres_min": 20, "out_of_state_owner": true, "exclude_corp_owner": true}Responses
Section titled “ Responses ”Paginated envelope for endpoints returning a list of parcel summaries.
Shared by the parcel-filter and property-search responses.
object
Total number of parcels matching the query (across all pages).
URL of the next page of results, or null on the last page.
URL of the previous page, or null on the first page.
Compact parcel record — used in search + filter results.
object
Land Insights numeric identifier for the parcel. Stable.
Direct link to view this parcel in the Land Insights web app.
Assessor’s Parcel Number — the county-assigned property identifier.
5-digit county FIPS code (2-digit state FIPS + 3-digit county FIPS).
Geographic centroid (point-on-surface) of the parcel as [longitude, latitude] in WGS84 (EPSG:4326). May be null if geometry is unavailable.
Parcel acreage as reported by the county assessor (source field LotSizeAcres). This is the authoritative legal/recorded acreage. For the acreage measured from the parcel polygon, see calculated_acres.
Parcel acreage computed from the parcel geometry (source field CalculatedAcres): the GIS area of the polygon in acres, rounded to two decimals. May differ from the assessor-reported acres due to surveying or geometry differences, and is null when geometry is unavailable.
Full name of the primary owner of record (raw string from assessor; typically uppercase, may include corporate suffixes like ‘LLC’).
Physical street address of the parcel (situs).
Situs city.
Situs two-letter US state code.
Situs 5-digit ZIP code.
Examples
Two-result page
{ "count": 87, "next": "https://api.landinsights.com/api/public/v1/properties/filter/?page=2", "previous": null, "results": [ { "property_id": 7234891, "url": "https://app.landinsights.co/data?parcel=7234891", "apn": "07111-04-006", "fips": 8023, "point": [ -105.42, 37.2 ], "acres": 5, "calculated_acres": 5.13, "owner_name": "SMITH JOHN", "situs_address": null, "situs_city": "SAN LUIS", "situs_state": "CO", "situs_zip": "81152" } ]}Validation error.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Missing or invalid credentials.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}A Pro subscription or higher API tier is required.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Authenticated but not permitted.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Resource not found.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Rate limit exceeded.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}Internal error.
object
object
Stable machine-readable error code. One of: unauthorized, forbidden, subscription_required, tier_upgrade_required, usage_limit_exceeded, payment_required, validation_error, not_found, method_not_allowed, rate_limited, internal_error.
Human-readable description of the error.
Echoes the request’s X-Request-Id (or a server-issued id). Quote it in support requests.
Present on validation errors only: maps each rejected field to its list of messages.
object
Example generated
{ "error": { "code": "example", "message": "example", "request_id": "example", "details": {} }}