Texas Parcel API
Look up any Texas property by coordinate, address, APN, owner, or acreage — 14.3 million parcels with owners, valuations, and GeoJSON boundaries, straight from the authoritative state parcel layer.
The Texas Parcel API turns the statewide TxGIO StratMap 2025 parcel layer into a fast, queryable REST service. Every lookup returns the full assessor record: owner, mailing & situs address, land-use codes, land / improvement / market valuations, legal description, FIPS, tax year — and the parcel boundary polygon as GeoJSON on request. Served from PostGIS with spatial (GiST), trigram, and B-tree indexes, so point-in-polygon and owner searches typically return in well under a second.
Authentication
The API is distributed through RapidAPI. Subscribe to a plan to get your personal API key, then send it on every request using these two headers:
| Header | Value |
|---|---|
X-RapidAPI-Key | Your personal key from the RapidAPI dashboard |
X-RapidAPI-Host | texas-parcels-api.p.rapidapi.com |
Base URL
https://texas-parcels-api.p.rapidapi.com
X-RapidAPI-Key private — treat it like a password.Quickstart
Find the parcel under a point in downtown Austin:
curl --request GET \
--url 'https://texas-parcels-api.p.rapidapi.com/parcels/by-point?lat=30.2672&lon=-97.7431' \
--header 'X-RapidAPI-Key: YOUR_KEY' \
--header 'X-RapidAPI-Host: texas-parcels-api.p.rapidapi.com'
Example response (truncated)
[
{
"id": 68992,
"apn": "200164",
"owner_name": "TEXAS PUBLIC FINANCE AUTHORITY",
"acreage": 21.93534558,
"market_value": 0.0,
"situs_state": "TX",
"county": "TRAVIS",
"geometry": null
}
]
Typical workflow
You rarely call the single-parcel endpoint directly with an ID. Instead, you discover parcels with a search endpoint, then optionally hydrate a specific result for full detail and geometry:
by-address, by-point, by-apn, by-owner, by-county, or by-acreage with something you know.2. Read the
id — every parcel in the response includes its id.3. Hydrate (optional) — call
GET /parcels/{id}?include_geometry=true for the full record plus boundary polygon.
Set include_geometry=true on any lookup to get the GeoJSON MultiPolygon boundary inline — handy for Leaflet, Mapbox, QGIS, or Turf.
Endpoints
All /parcels/* endpoints require your RapidAPI key. include_geometry defaults to false on lookups and true on the single-parcel endpoint.
Service health probe. No parameters.
GET /health → {"status":"ok"}
Find the parcel at a latitude/longitude (point-in-polygon, up to 5 matches).
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
lat | float | yes | — | Latitude, WGS84 |
lon | float | yes | — | Longitude, WGS84 |
include_geometry | bool | no | false | Return GeoJSON boundary |
GET /parcels/by-point?lat=30.2672&lon=-97.7431
Find a parcel by street address. Geocodes the address (U.S. Census) and returns the nearest parcels within ~100 m, ordered by proximity (up to 5). No separate geocoder needed.
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
address | string | yes | — | Any U.S. street address |
include_geometry | bool | no | false | Return GeoJSON boundary |
GET /parcels/by-address?address=100 Congress Ave, Austin, TX 78701
Look up a parcel by county + APN / parcel number (case-insensitive exact match).
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
county | string | yes | — | Texas county name |
apn | string | yes | — | Parcel ID / APN |
include_geometry | bool | no | false | Return GeoJSON boundary |
GET /parcels/by-apn?county=Travis&apn=200164
Find all parcels owned by a person or entity (case-insensitive substring match, 25 results per page).
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
name | string | yes | — | Owner name (substring) |
page | int | no | 1 | 1-indexed, 25/page |
include_geometry | bool | no | false | Return GeoJSON boundary |
GET /parcels/by-owner?name=CITY OF AUSTIN&page=1
List every parcel in a county (50 results per page, geometry omitted for speed).
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
county | string | yes | — | Texas county name |
page | int | no | 1 | 1-indexed, 50/page |
GET /parcels/by-county?county=Travis&page=1
Find parcels in a county within an acreage range (50 per page, sorted largest first; geometry omitted).
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
county | string | yes | — | Texas county name |
min | float | no | 0 | Minimum acres (inclusive) |
max | float | no | 1e9 | Maximum acres (inclusive) |
page | int | no | 1 | 1-indexed, 50/page |
GET /parcels/by-acreage?county=Travis&min=10&max=100&page=1
Get one parcel's full record, including geometry by default. The id comes from the response of any search endpoint above — it is an internal handle, not something an end user types.
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
id | int | yes (path) | — | Internal parcel ID from a search result |
include_geometry | bool | no | true | GeoJSON boundary included unless false |
GET /parcels/68992
Response schema
Every endpoint returns a Parcel object (or an array of them). geometry is null unless include_geometry=true (or on GET /parcels/{id}, where it is included by default).
| Field | Type | Example |
|---|---|---|
id | int | 68992 |
apn | string | "200164" |
geo_id | string | "210040114" |
owner_name | string | "SMITH, JOHN" |
name_care | string | "c/o Jane Doe" |
legal_desc | string | "LOT 1 BLK A SUNSET ADDN" |
legal_area | float | 5.25 |
legal_area_unit | string | "Acres" |
acreage | float | 5.25 |
state_land_use | string | "A1" |
local_land_use | string | "101" |
land_value | float | 50000.0 |
improvement_value | float | 150000.0 |
market_value | float | 200000.0 |
situs_address | string | "100 Congress Ave" |
situs_city | string | "Austin" |
situs_state | string | "TX" |
situs_zip | string | "78701" |
mail_address | string | "PO Box 456" |
mail_city | string | "Austin" |
mail_state | string | "TX" |
mail_zip | string | "78767" |
county | string | "Travis" |
fips | string | "48453" |
source | string | "StratMap 2025" |
date_acquired | string | "2020-01-15" |
tax_year | int | 2024 |
year_built | string | "1995" |
geometry | GeoJSON | null | {"type":"MultiPolygon",…} |
Errors
| Status | Meaning |
|---|---|
200 | Success — parcel object or array returned. |
401 | Missing or invalid RapidAPI key. |
404 | No parcel found (e.g. unknown ID or unmatched address). |
422 | Invalid parameter (e.g. non-numeric id, missing required query param). |
429 | Rate limit exceeded for your plan. |
[] with status 200 — only the single-parcel GET /parcels/{id} returns 404 when an ID doesn't exist.