Faelo / HCAD Harris County Property-Tax API
HCAD Harris County Property-Tax API
Assessment-protest outcomes and per-parcel value history for every Harris County, Texas parcel. No owner names.
Harris County (Houston) publishes its appraisal roll only as bulk annual downloads with no per-parcel API and no protest-outcome data. This API adds both: for one parcel, every ARB hearing with the value before the protest and the value after, plus the assessed-value series. Owner names and mailing addresses are dropped at ingest and never served.
Coverage
1.6 million parcels; protest outcomes 2005-2026, values 2015-2026. Source: Harris County Appraisal District — Texas public record (Tex. Gov't Code ch. 552; Tex. Tax Code 25.027).
Routes
| Method | Path | Access | Price |
|---|---|---|---|
GET | /search?addr=<street>&limit=<n> | free | — |
GET | /parcel/{acct} | free | — |
GET | /parcel/{acct}/history | paid | $0.02 |
GET | /parcel/{acct}/protests | paid | $0.03 |
GET | /area/{neighborhood}/protest-stats | paid | $0.05 |
Live API root: https://hcad-api.canvas-cart.workers.dev · /llms.txt · /stats
Record ids
a 13-digit HCAD account number, e.g. "0010090000001"; get it from /search?addr=.
Free search: https://hcad-api.canvas-cart.workers.dev/search?addr=COMMERCE+ST&limit=3
How an agent pays
Request /parcel/{acct}/protests. The API answers 402 Payment Required with the price ($0.02-$0.05 per call), the network (eip155:8453), the USDC asset (0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913), and the payout address. Pay, repeat the request, receive the full record. The 402 also carries x402 Bazaar discovery data.
import { wrapFetchWithPayment, x402HTTPClient } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const signer = privateKeyToAccount(process.env.PRIVATE_KEY); // a funded Base wallet
const client = new x402Client();
client.register("eip155:*", new ExactEvmScheme(signer));
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
const httpClient = new x402HTTPClient(client);
const res = await fetchWithPayment("https://hcad-api.canvas-cart.workers.dev/parcel/0010090000001/protests");
const out = await httpClient.processResponse(res);
console.log(out.paymentStatus, out.body);