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

MethodPathAccessPrice
GET/search?addr=<street>&limit=<n>free
GET/parcel/{acct}free
GET/parcel/{acct}/historypaid$0.02
GET/parcel/{acct}/protestspaid$0.03
GET/area/{neighborhood}/protest-statspaid$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);