docs/api reference/Property Discovery Query
Home ↗
POST/api/property/query

Property Discovery Query

Discover properties inside a single canonical county using explicit filters and pagination. Use this when you want to explore a market segment; use /api/propertyfor a known parcel and /api/property/batch for a known list of addresses.

Real production examples commonly start with filters.zip and then narrow with appraisal, land, improvement, living area, year built, owner text, address text, flood, or radius filters. You can sort by appraisedValue, landValue,improvementValue, livingAreaSqft, yearBuilt, propertyType,address, or distance when a center point is provided. Billing is per item returned, not per request, and the response includes that in meta.billing.

curl -X POST https://api.parcelkit.us/api/property/query \
  -H "x-api-key: sk_live_your_key" \
  -H "content-type: application/json" \
  -d '{
  "state": "TX",
  "county": "Harris",
  "filters": {
    "zip": ["77002"],
    "min_appraised_value": 200000,
    "min_land_value": 30000,
    "min_living_area_sqft": 1500,
    "min_year_built": 1990,
    "property_type": "Office",
    "sort": { "by": "yearBuilt", "direction": "desc" }
  },
  "page": 1,
  "page_size": 25
}'
response.json
{
  "ok": true,
  "query": {
    "state": "TX",
    "county": "Harris",
    "county_canonical": "Harris County",
    "county_slug": "harris",
    "filters": {
      "zip": ["77002"],
      "min_appraised_value": 200000,
      "min_land_value": 30000,
      "min_living_area_sqft": 1500,
      "min_year_built": 1990,
      "property_type": "Office",
      "sort": { "by": "yearBuilt", "direction": "desc" }
    },
    "page": 1,
    "page_size": 25
  },
  "data": [
    {
      "id": "TX-HCAD-0010490000009",
      "address": "PRAIRIE ST, HOUSTON, TX 77002",
      "county": "Harris",
      "owner": "E BATMANIS HOLDINGS LLC",
      "appraisedValue": 470052,
      "landValue": 464354,
      "improvementValue": 5698,
      "livingAreaSqft": 1674,
      "yearBuilt": 2001,
      "propertyType": "Office",
      "cadUrl": "https://search.hcad.org/?searchType=accountNumber&searchValue=0010490000009",
      "city": "HOUSTON",
      "zip": "77002",
      "lat": 29.758709741610794,
      "lon": -95.35806409145607
    },
    {
      "id": "TX-HCAD-1269460000025",
      "address": "705 MAIN ST, HOUSTON, TX 77002",
      "county": "Harris",
      "owner": "PARKER ANDREW",
      "appraisedValue": 206247,
      "landValue": 39187,
      "improvementValue": 167060,
      "livingAreaSqft": 2412,
      "yearBuilt": 1998,
      "propertyType": "Office Condo",
      "cadUrl": "https://search.hcad.org/?searchType=accountNumber&searchValue=1269460000025",
      "city": "HOUSTON",
      "zip": "77002",
      "lat": 29.75871811738265,
      "lon": -95.3628747221591
    }
  ],
  "pagination": {
    "page": 1,
    "page_size": 25,
    "returned": 25,
    "has_more": true,
    "next_page": 2
  },
  "meta": {
    "partial": false,
    "async": false,
    "billing": {
      "charged_credits": 25,
      "billing_model": "per_returned_item"
    }
  }
}

Copy-Paste Examples

These are the most common starting patterns for discovery queries.

ZIP only

Start with a single county and one ZIP when you want the cleanest baseline segment.

curl -X POST https://api.parcelkit.us/api/property/query \
  -H "x-api-key: sk_live_your_key" \
  -H "content-type: application/json" \
  -d '{
    "state": "TX",
    "county": "Harris",
    "filters": {
      "zip": ["77002"]
    },
    "page": 1,
    "page_size": 25
  }'

ZIP + minimum appraisal

Narrow the candidate set to higher-value parcels without changing the county scope.

curl -X POST https://api.parcelkit.us/api/property/query \
  -H "x-api-key: sk_live_your_key" \
  -H "content-type: application/json" \
  -d '{
    "state": "TX",
    "county": "Harris",
    "filters": {
      "zip": ["77002"],
      "min_appraised_value": 200000
    },
    "page": 1,
    "page_size": 25
  }'

ZIP + distance sort

Use a center address or center ZIP when you want the closest parcels first. Distance sorting requires center plus radius_miles.

curl -X POST https://api.parcelkit.us/api/property/query \
  -H "x-api-key: sk_live_your_key" \
  -H "content-type: application/json" \
  -d '{
    "state": "TX",
    "county": "Harris",
    "filters": {
      "zip": ["77002", "77003"],
      "center": {
        "address": "1000 Louisiana St, Houston, TX 77002"
      },
      "radius_miles": 1.25,
      "sort": {
        "by": "distance",
        "direction": "asc"
      }
    },
    "page": 1,
    "page_size": 25
  }'

ZIP + structural filters

Use this when discovery depends on physical characteristics like square footage, year built, and property type instead of only value bands.

curl -X POST https://api.parcelkit.us/api/property/query \
  -H "x-api-key: sk_live_your_key" \
  -H "content-type: application/json" \
  -d '{
    "state": "TX",
    "county": "Harris",
    "filters": {
      "zip": ["77002"],
      "min_living_area_sqft": 1500,
      "max_living_area_sqft": 5000,
      "min_year_built": 1990,
      "property_type": "Office",
      "sort": {
        "by": "yearBuilt",
        "direction": "desc"
      }
    },
    "page": 1,
    "page_size": 25
  }'

state, county, and filters.zip are required. This endpoint does not geocode, infer, or heuristically substitute counties. In V1 it is synchronous and paginated, and it charges per item returned instead of per request.

For radius discovery, filters.center can be a resolved coordinate object for legacy clients, but the preferred DX is { address: "..." } or { zip: "77002" }. ParcelKit resolves the center internally before applying radius or distance sorting.

Structural filters such as min_living_area_sqft, max_living_area_sqft,min_year_built, max_year_built, and property_type are only accepted when the county provider can supply them reliably. ParcelKit returns 400 instead of silently inventing or degrading those results.

Use /api/property/search when you already know an address and want one resolved property. Use /api/property/query when you want discovery inside one county segment such as a ZIP plus appraisal threshold. Use /api/property/batch when you already have a list of addresses to process independently.