API
A read-only API over HTTPS. Each customer gets an API key, and the base URL comes with it. New data is ready every morning after the county files are pulled.
How delivery works
- Every morning we pull the county, court and city files, tie each record to its property and owner, and publish the result.
- Each record has an
updateddate, the day it last changed. Ask forsince=the last date you hold and you get only what's new or changed. - Daily change files list the same changes as gzip NDJSON (one JSON record per line), with
{"id": ..., "removed": true}lines for records that dropped off (for example, taxes paid). - Full snapshots of each county and record type are available any time.
Authentication
Send your key in the x-api-key header on every request. Requests without a valid key are refused. Each key has its own rate limit and daily quota, and every request is logged. HTTPS only.
curl -H "x-api-key: YOUR_KEY" "https://BASE_URL/v1/coverage"
Endpoints
| Request | What it returns |
|---|---|
GET /v1/coverage | Counties, record types, counts and dates you can pull |
GET /v1/signals?county=Travis&signal=tax_suit&since=2026-01-01 | Records, newest changes included, up to 500 per page. Pass next_cursor back as cursor= for the next page |
GET /v1/exports/{date} | Short-lived download links (15 minutes) for that day's change files and the current full snapshots. date can be latest |
GET /v1/parcels/{county}/{parcel_id} | One property: owner, exemptions, tax status and every record we deliver for it |
Record types (signal): tax_delinquent, tax_suit, code_violation, foreclosure, eviction, probate, divorce, civil.
Sample record
Every value below is made up.
{
"id": "0000example0000example0000example0000000",
"signal": "tax_suit",
"county": "Example",
"filed_date": "2026-01-15",
"case_number": "TX-0000-EXAMPLE",
"status": "in_suit",
"amount": 1234.56,
"parties": [{"name": "EXAMPLE OWNER LLC"}],
"property_address": "123 SAMPLE ST",
"match": {"parcel_id": "000000000", "method": "parcel", "confidence": "confirmed"},
"owner": {"name": "EXAMPLE OWNER LLC", "mail_address": "PO BOX 0000", "mail_city": "ANYTOWN",
"mail_state": "TX", "mail_zip": "00000", "absentee": true, "out_of_state": false},
"property": {"situs_address": "123 SAMPLE ST", "property_use": "A1", "year_built": 1999,
"market_value": 100000, "deed_date": "2010-01-01"},
"exemptions": {"codes": ["HS"], "homestead": true, "over_65": false, "disabled": false,
"disabled_veteran": false, "tax_deferral": false},
"tax": {"taxes_owed": 1234.56, "first_year_delinquent": "2024", "suit_status": "in_suit",
"suit_number": "TX-0000-EXAMPLE", "judgment_date": null, "bankruptcy": false, "deferral": false},
"lender": {"lender_eligible": true, "ineligible_reasons": [], "notices": []},
"source": {"name": "Example County Tax Office", "attribution": null},
"first_seen": "2026-01-20T11:00:00Z",
"updated": "2026-01-20"
}
Sample page
{
"county": "Example",
"signal": "tax_suit",
"since": "2026-01-01",
"count": 500,
"next_cursor": "eyJleGFtcGxlIjoidHJ1ZSJ9",
"records": [ ... ]
}
Errors
| Code | Meaning |
|---|---|
| 400 | A parameter is missing or wrong; the message says which |
| 403 | Missing or invalid API key |
| 404 | No such export date or no records for that parcel |
| 410 | The data was refreshed after your cursor was issued. Start again with since= |
| 429 | Rate limit or daily quota reached |
Permitted use
Keys are issued only to businesses that agree to our terms: real estate marketing, lending outreach and research only, and never for credit, employment, insurance or tenant-screening eligibility decisions.
To get a key, contact us.