Parcels
The main event: one parcel's full tax picture — entities, per-entity values, collectors, rates, exemptions.
GET /v1/parcels/{county_fips}/{account_number}
GET/v1/parcels/{county_fips}/{account_number}
One parcel by county + CAD account number, with boolean expansions. Parcels are account-centric: the natural key is (county_fips, account_number) — there is no statewide parcel ID, and account numbers are unique only within a district.
| Parameter | In | Type | Description |
|---|---|---|---|
| county_fips* | path | string | 5-digit county FIPS, e.g. 48201 = Harris. |
| account_number* | path | string | The CAD's account number for the parcel. |
| year | query | integer | Tax year. Defaults to the newest available. |
| taxing_units | query | boolean | Include the tax-bill lines (entities + per-entity values). |
| collectors | query | boolean | Include each unit's collector contact (implies taxing_units). |
| rates | query | boolean | Include each unit's latest adopted rates (implies taxing_units). |
| exemptions | query | boolean | Include the parcel's exemption lines. |
Only requested sections appear in the response; the rest are omitted entirely.
Request
curl "https://graywinston.modavi.me/v1/parcels/48201/0123450000004?taxing_units=true&collectors=true" \
-H "X-API-Key: $GW_API_KEY"Response (abridged)
{
"data": {
"id": 123456,
"county_fips": "48201",
"account_number": "0123450000004",
"tax_year": 2026,
"geo_id": "…",
"situs": "1001 MAIN ST",
"situs_city": "HOUSTON",
"situs_zip": "77002",
"owner_name": "SMITH JOHN",
"owner_mailing": "PO BOX …",
"state_category": "A1",
"land_value": 85000,
"improvement_value": 165000,
"total_market_value": 250000,
"appraised_value": 250000,
"assessed_value": 250000,
"value_status": "certified",
"under_appeal": false,
"provenance": { "source_code": "hcad_bulk", "status": "success", "…": "…" },
"taxing_units": [
{
"tax_district": "011",
"unit_code": "482-011-01",
"unit_name": "HOUSTON ISD",
"taxable_value": 235000,
"appraised_value": 250000,
"collector": {
"id": "…",
"name": "…",
"collector_type": "county",
"email": "…",
"phone": "…",
"website": "…"
},
"tax_rates": [
{ "tax_year": 2025, "total_rate": 1.0967, "no_new_revenue_rate": 1.0512, "…": "…" }
]
}
]
}
}One parcel, many taxable values
Texas runs a cascade: market → appraised (after the homestead cap) → assessed → taxable, which differs per taxing unit because exemptions vary by entity. The parcel row carries the county-wide values; each
taxing_units[] line carries that unit's taxable/appraised figures.GET /v1/parcels
GET/v1/parcels
Filter list. At least one filter is required — account is not a filter (an account identifies exactly one parcel; use the lookup above).
| Parameter | In | Type | Description |
|---|---|---|---|
| county | query | string | County FIPS, e.g. 48201 for Harris. |
| year | query | integer | Tax year. |
| situs | query | string | Situs address prefix match. |
| owner_name | query | string | Owner name prefix match (exploration filter). |
| state_category | query | string | Exact state category code (A/B/C/D/E/F/G/J/L). |
| limit | query | integer | Page size, 1–200. Default 50. |
| offset | query | integer | Page offset. Default 0. |
Response (abridged)
{
"data": [
{ "id": 123456, "county_fips": "48201", "account_number": "0123450000004", "…": "…" }
],
"meta": { "total": 1834, "limit": 50, "offset": 0 }
}Field reference
| Field | Meaning |
|---|---|
geo_id | The CAD's property/geo identifier (the client's "PID" filter) |
situs / owner_mailing | Property location vs notice mailing address — they diverge constantly on commercial property |
state_category | Statewide property category code (A single-family, B multifamily, C vacant, D acreage, E farm/ranch, F commercial, G industrial, J pipelines, L other) |
value_status | Roll state: preliminary / certified / supplemented — "final" values still change year-round |
certified_at | When the roll was certified (typically ~Jul 25) |
under_appeal | Parcel has an active ARB appeal |