HeritageDeed Title Search and Property Data
US title search reports, pre-checked tax and sheriff sale lists, surplus funds and tax sale lists, and free property lookups: flood zone, radon, Superfund, LLC owner, loan limits, zoning.
Hosted MCP Server
npx add-mcp 'https://heritagedeed.com/mcp/public'Installs into Claude Code, Codex, Cursor and more
Documentation
Title search API documentation
HeritageDeed has a title search API: a REST API at https://heritagedeed.com/api/v1 where you order a Current Owner Search (an O&E report) for a property in 43 covered counties, or an Environmental Records Report for any US address, then read the finished report as JSON and PDF. Keys are free; reports cost $49 (title) and $29 (environmental). AI agents can also use the keyless MCP server.
Compare Save 75%+
Elsewhere $100–$400$25per report
Elsewhere = Owner and encumbrance reports ordered one by one from title search companies, typical published prices. How we compare
REST API v1 · API key
https://heritagedeed.com/api/v1
MCP server · no key
https://heritagedeed.com/mcp/public
Get a free API key · OpenAPI 3.1 spec · What the API is for · free key, reports $49 and $29
Quick start
- Get a key (email and what you will use the reports for). It is shown once: HeritageDeed keeps only a hash.
- Send it on every request as
Authorization: Bearer hd_live_... POST /api/v1/orderswith the report type and address. Add anIdempotency-Keyheader so a retried request never orders twice.- Wait for the signed webhook, or poll
GET /api/v1/orders/{id}every 20 seconds or so: most reports finish in one to three minutes. - Read
GET /api/v1/orders/{id}/report(JSON) and/pdf.
Report types
This list is read live from GET /api/v1/report-types: the API accepts exactly the reports the website sells.
| report_type | What you get | Where | Price |
|---|---|---|---|
| current_owner | Current Owner Search. owner of record and vesting deed, every deed, mortgage and release the county index returns with each mortgage matched to its release, recorded liens, lis pendens and UCC fixture filings, federal court and bankruptcy records matched to the owner, property tax status, FEMA flood zone and, where published, city building violations and permits. PDF plus JSON. | Covered counties | $49 |
| environmental | Environmental Records Report. federal environmental records near any US street address (EPA Superfund NPL and SEMS sites, RCRA hazardous waste handlers, ECHO-regulated facilities, underground storage tanks, brownfields), the FEMA flood zone and National Risk Index ratings, USFWS mapped wetlands and the EPA radon zone. A records search, not a Phase I Environmental Site Assessment. PDF plus JSON. | Any US street address | $29 |
| tax_appeal | Property Tax Appeal Evidence Pack. Property Tax Appeal Evidence Pack | Covered counties | $49 |
Title searches cover 43 counties in 14 states: New York (New York County / Manhattan, Kings County / Brooklyn, Queens County / Queens, Bronx County / The Bronx, Richmond County / Staten Island, Erie County); Florida (Duval County, Hillsborough County, Brevard County, Pasco County, Okaloosa County); Illinois (Cook County); Pennsylvania (Philadelphia County / Philadelphia, Lancaster County, Beaver County); Texas (McLennan County, Randall County, Ector County, Taylor County, Wichita County, Kaufman County, Erath County, Upshur County, Rockwall County, Burnet County, Aransas County, Calhoun County, Colorado County, Wood County, Harris County); Arizona (Maricopa County); Arkansas (Pulaski County); North Carolina (Durham County, Forsyth County); South Carolina (Horry County / Myrtle Beach); Ohio (Hamilton County / Cincinnati, Lucas County / Toledo, Delaware County / Delaware, Powell, Montgomery County / Dayton); Utah (Utah County / Provo); Georgia (Fulton County / Atlanta); Michigan (Oakland County / Troy); California (Shasta County / Redding). Send state as the two-letter code and county without the word County; GET /api/v1/coverage returns the exact values. The coverage pages say what each county's search includes and does not, and the sample report shows a real result.
Paying for reports and plans through the API
Everything sold on the website can be bought and used with an API key. Create keys on your account page (they are active at once and spend that account's credits) or with POST /api/v1/keys.
- With report credits ($25 per report, $250 per pack of 10):
POST /api/v1/ordersis paid at once from the account's credits (payment_status: "credit") and the search starts immediately. Batches need one credit per row. Buy credits on the account page or withPOST /api/v1/credits/checkout; check the balance withGET /api/v1/account/credits. - Without credits: the order is created with a
checkout_url. Open it in a browser to pay the report price ($49 title, $29 environmental, $49 tax appeal); the search starts as soon as the payment is confirmed and your webhook is called when the report is ready. - Plans:
POST /api/v1/plans/checkout(Pro $39 a month, Pro Reports $199 a month with 10 reports a month) andPOST /api/v1/watches/checkout(Property Watch, $9.99 a month per property) return checkout links. Payments are processed by Creem, our merchant of record. - Report JSON (
GET /api/v1/orders/{id}/report) carries everything the PDF shows: the owner and vesting deed, every deed, mortgage (withstatusopen or released), release, assignment, lien, lis pendens, easement and UCC filing with its document reference, court cases (matched by the owner's name and marked so), violations, permits, business entities, tax bills, sales, building details and every notice.
Endpoints
| Endpoint | What it does | Key |
|---|---|---|
| POST /api/v1/keys | Get a free API key. The key is shown once; only a hash of it is stored. | no |
| GET /api/v1/report-types | Report types you can order, with coverage and price. | no |
| GET /api/v1/coverage | Covered title-search states and counties (exact values to send). | no |
| POST /api/v1/precheck | Match an address to its county parcel before ordering. | yes |
| POST /api/v1/orders | Order one report. Idempotency-Key header; optional webhook_url and client_reference. | yes |
| GET /api/v1/orders/{id} | Status, progress, links to the JSON and the PDF. | yes |
| GET /api/v1/orders/{id}/report | The finished report as JSON. | yes |
| GET /api/v1/orders/{id}/pdf | Redirect (302) to the PDF. | yes |
| GET /api/v1/orders | Your orders, newest first; filter by status, batch_id or client_reference. | yes |
| POST /api/v1/batches | Up to 50 orders at once: a JSON array or a CSV file. Every row gets its own status. | yes |
| GET /api/v1/batches/{id} | Batch status with every row and its order. | yes |
| GET /api/v1/batches/{id}/results.csv | One CSV line per submitted row: order status, PDF and JSON links. | yes |
| GET /api/v1/account | Your limits, usage and webhook signing secret. | yes |
| PATCH /api/v1/account | Set the white-label company name and the default webhook URL. | yes |
| DELETE /api/v1/account | Revoke the key. Cannot be undone. | yes |
| GET /api/v1/products | Every product with its price: reports, plans, report credits, Property Watch. | no |
| GET /api/v1/account/credits | Report credits, plans and Pro status of the key's account. | yes |
| POST /api/v1/credits/checkout | Buy report credits ($250 per 10): returns a checkout link. | yes |
| POST /api/v1/plans/checkout | Start HeritageDeed Pro or Pro Reports: returns a checkout link. | yes |
| GET /api/v1/watches | Property Watch: your watched properties and plan. | yes |
| POST /api/v1/watches | Property Watch: watch a property (address, state, county). | yes |
| GET /api/v1/watches/{id} | Property Watch: one watch with its alerts. | yes |
| DELETE /api/v1/watches/{id} | Property Watch: stop watching. | yes |
| POST /api/v1/watches/checkout | Property Watch: pay for watched properties ($9.99 a month each). | yes |
| GET /api/v1/lists/{surplus|tax_sale}/export.csv | Pro: every county of a list as CSV; history=1 adds removed listings. | yes |
Lookups, in full, with your key
The free lookups on the website show the first rows to visitors. Send your API key (Authorization: Bearer <key>) and they answer in full. Base URL https://heritagedeed.com/api.
| Endpoint | What it returns |
|---|---|
| POST /api/tools/flood-zone | Flood zone at an address |
| POST /api/tools/superfund-sites | Superfund sites near an address |
| POST /api/tools/radon | Radon zone and test results for an address or ZIP |
| POST /api/tools/fault-lines | Mapped faults near an address |
| POST /api/tools/power-lines | High-voltage transmission lines near an address |
| POST /api/tools/property-history | Property history (deeds and sales) for an address |
| POST /api/tools/building-records | Building violations and permits (Chicago, Philadelphia, Cincinnati) |
| POST /api/tools/zoning | Zoning district of an address |
| POST /api/tools/llc-lookup | Who is behind an LLC or corporation |
| POST /api/tools/nyc-landlord | NYC building registration, contacts and violations |
| POST /api/tools/hoa-lookup | HOA of a property |
| POST /api/tools/ucc-search | UCC filings by debtor name |
| POST /api/tools/census-tract | Census tract and lending designations of an address |
| POST /api/tools/usda-eligibility | USDA property eligibility of an address |
| POST /api/tools/title-premium | Title insurance premium estimate |
| POST /api/tools/transfer-tax | Transfer tax estimate |
| POST /api/tools/net-sheet | Seller net sheet |
| GET /api/data/loan-limits/{state}/{county} | Conforming, FHA and VA loan limits of a county |
| GET /api/data/fair-market-rent/{state}/{county} | Fair market rents of a county (also /zip/{zip5}) |
| GET /api/data/property-tax-rates/{state}/{county} | Effective property tax rate (also /zip/{zip5}) |
| GET /api/surplus?state=&county= | Surplus funds list of a county, every row |
| GET /api/tax-sale?state=&county= | Tax sale list of a county, every row |
| GET /api/recent-sales/{state}/{county} | Recent recorded sales of a county |
| POST /api/tax-sale/due-diligence | Tax sale due diligence for a list of parcels (job; CSV and PDF sheet) |
| GET /api/stats/superfund/{state} | Every Superfund site of a state |
Code samples
# 1. Order a Current Owner Search (O&E report)
curl -X POST https://heritagedeed.com/api/v1/orders \
-H "Authorization: Bearer $HERITAGEDEED_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: deal-1042" \
-d '{"report_type": "current_owner",
"address": "350 5th Ave, New York, NY 10118",
"state": "NY", "county": "New York",
"client_reference": "deal-1042",
"webhook_url": "https://example.com/hooks/heritagedeed"}'
# 2. Poll until "status" is "complete" (or wait for the webhook)
curl https://heritagedeed.com/api/v1/orders/ORDER_ID -H "Authorization: Bearer $HERITAGEDEED_KEY"
# 3. Read the report as JSON, or follow the redirect to the PDF
curl https://heritagedeed.com/api/v1/orders/ORDER_ID/report -H "Authorization: Bearer $HERITAGEDEED_KEY"
curl -L -o report.pdf https://heritagedeed.com/api/v1/orders/ORDER_ID/pdf -H "Authorization: Bearer $HERITAGEDEED_KEY"
# Batch: up to 50 rows from a CSV (header row required)
curl -X POST https://heritagedeed.com/api/v1/batches -H "Authorization: Bearer $HERITAGEDEED_KEY" \
-F [email protected] -F webhook_url=https://example.com/hooks/heritagedeed
Python (requests): order an environmental report and wait for it
import os, time, requests
API = "https://heritagedeed.com/api/v1"
H = {"Authorization": f"Bearer {os.environ['HERITAGEDEED_KEY']}"}
order = requests.post(f"{API}/orders", headers={**H, "Idempotency-Key": "deal-1042"}, json={
"report_type": "environmental", # any US street address
"address": "300 Bond St, Brooklyn, NY 11231",
"client_reference": "deal-1042",
}, timeout=60).json()
while order["status"] not in ("complete", "failed"):
time.sleep(20)
order = requests.get(f"{API}/orders/{order['id']}", headers=H, timeout=30).json()
if order["status"] == "complete":
report = requests.get(f"{API}/orders/{order['id']}/report", headers=H, timeout=30).json()
print(order["links"]["pdf"], report["property"])
else:
print("failed:", order["error_message"])
JavaScript (Node 18+ fetch): a two-row batch with a webhook
const API = "https://heritagedeed.com/api/v1";
const H = { Authorization: \`Bearer ${process.env.HERITAGEDEED_KEY}\`, "Content-Type": "application/json" };
const res = await fetch(\`${API}/batches\`, {
method: "POST",
headers: { ...H, "Idempotency-Key": "portfolio-2026-10" },
body: JSON.stringify({
webhook_url: "https://example.com/hooks/heritagedeed",
orders: [
{ report_type: "current_owner", address: "1600 Smith St, Houston, TX 77002", state: "TX", county: "Harris", client_reference: "a-1" },
{ report_type: "environmental", address: "10 Common St, Woburn, MA 01801", client_reference: "a-2" },
],
}),
});
const batch = await res.json(); // every row: "queued" or "rejected" with the reason
console.log(batch.id, batch.counts, batch.links.results_csv);
Webhooks
Set webhook_url on an order, on a batch, or as the key's default_webhook_url. It must be https on a public host: addresses that resolve to private, loopback or link-local networks are refused, and redirects are not followed. Events: order.completed, order.failed, order.refunded and batch.completed. Any 2xx answer counts as delivered; anything else is retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 8 hours, with the same HeritageDeed-Delivery id each time so you can drop duplicates.
Verify HeritageDeed-Signature: t=<unix>,v1=<hex>: HMAC-SHA256 of <t>.<raw body> with your webhook secret (GET /api/v1/account; replace it with POST /api/v1/account/webhook-secret). Reject timestamps older than five minutes.
POST https://example.com/hooks/heritagedeed
HeritageDeed-Event: order.completed
HeritageDeed-Delivery: evt_6f1c1f0e8f5e4a0e9a572b1f0c3d4e5f_complete
HeritageDeed-Signature: t=1760968479,v1=5b0c...e91
{"id": "evt_6f1c...e5f_complete", "object": "event", "type": "order.completed",
"created": "2026-10-20T14:04:39+00:00",
"data": {"object": "order", "id": "6f1c1f0e-...", "status": "complete", "client_reference": "deal-1042",
"links": {"report_json": ".../api/v1/orders/6f1c.../report", "pdf": ".../api/files/6f1c.../current_owner.pdf"}}}
import hashlib, hmac, time
def verify(secret: str, raw_body: bytes, header: str, tolerance=300) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
ts = int(parts["t"])
expected = hmac.new(secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256).hexdigest()
return abs(time.time() - ts) <= tolerance and hmac.compare_digest(expected, parts["v1"])
# verify(WEBHOOK_SECRET, request.body, request.headers["HeritageDeed-Signature"])
import crypto from "node:crypto";
export function verify(secret, rawBody, header, tolerance = 300) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=", 2)));
const ts = Number(parts.t);
const expected = crypto.createHmac("sha256", secret).update(\`${ts}.\`).update(rawBody).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - ts) <= tolerance;
return fresh && expected.length === parts.v1?.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}
Batches and idempotency
POST /api/v1/batches takes up to 50 orders as JSON ({"orders": [...]}) or as a CSV file (columns report_type, address, state, county, parcel_id, client_reference, header row required). Every row is checked at once with the same rules as a single order: bad rows come back rejected with the reason, the rest are queued and become orders a few at a time, so a batch never holds up other customers. Follow it with GET /api/v1/batches/{id}, download results.csv, or wait for batch.completed.
Send an Idempotency-Key header (any unique string) on POST /orders and POST /batches. Repeating the request with the same key and body returns the original order or batch (status 200, Idempotent-Replayed: true); the same key with a different body is refused (409). A county record system that is down is never reported as "not found": the order retries for up to about 20 minutes, then delivers the report with the gap named, or fails with the reason.
White-label PDF
PATCH /api/v1/account with {"white_label_name": "Your Company"} puts your company name in the brand position of the PDF cover for reports ordered from then on. Every page keeps a footer saying the report was prepared by HeritageDeed and is a public-records search, not title insurance, a title commitment or a legal opinion, and the report's disclaimer is unchanged. Names only (2 to 80 letters, digits and simple punctuation); no logo upload.
Limits and acceptable use
- 60 requests per minute per key; 25 orders per day and 300 per month per key
- At most 50 rows per batch; up to 3 active keys per email address
- Per-IP ceilings on requests and on new keys; 429 answers carry Retry-After
- Every key action, order and webhook outcome is written to an audit log; keys can be revoked at any time (DELETE /api/v1/account)
- No use for any purpose covered by the Fair Credit Reporting Act; no reselling reports in bulk (Terms, sections 4 and 5)
A HeritageDeed report is a search of public records, not title insurance, a title commitment, an abstract certified by a licensed abstractor or a legal opinion. Reports may not be used for any purpose covered by the Fair Credit Reporting Act, such as deciding a person’s eligibility for credit, insurance, employment, housing or tenancy. Terms: API and MCP access.
MCP server for AI agents
The public MCP server at https://heritagedeed.com/mcp/public needs no key or account. Any MCP client can check coverage, check an address, order a title search, follow it and read the report. It is limited per client IP, which suits an assistant working for one person; for software that orders for many users, use the REST API with a key.
claude mcp add --transport http heritagedeed https://heritagedeed.com/mcp/public
Settings → Connectors → Add custom connector → URL: https://heritagedeed.com/mcp/public → No sign-in
{
"mcpServers": {
"heritagedeed": { "url": "https://heritagedeed.com/mcp/public" }
}
}
Tools, with an example call each
Every tool returns the facts, the page on heritagedeed.com that shows them, and the same caveats as the page. The example is the arguments object of a tools/call request.
Reports: title search and environmental
Two reports, $49 per report each, delivered as a PDF plus JSON. The title search runs in the covered counties; the Environmental Records Report runs at any US street address.
| Tool | What it does | Example arguments |
|---|---|---|
| list_coverage() | Where every product works: title search states and counties with their main cities, and the cities, places, counties and states of each free lookup. New counties appear as they are added. | {} |
| check_coverage(state, county) | Whether a title search can be ordered for a county, borough or city (Brooklyn, Tampa, Houston), and the exact values to order with. | {"state": "NY", "county": "Brooklyn"} |
| check_address(address, state?, county?, report_type?) | Matches the address before ordering: to its county parcel for a title search, or to a US location for report_type environmental. Answers matched, not_found, not_covered or unavailable. | {"address": "350 5th Ave, New York, NY 10118", "state": "NY", "county": "New York"} |
| order_title_search(address, state?, county?, email?, report_type?) | Places the order and returns an order_id. report_type current_owner (default) is the title search; environmental is the Environmental Records Report and needs only the address. | {"address": "300 Bond St, Brooklyn, NY 11231", "report_type": "environmental"} |
| get_order_status(order_id) | Status, progress and the PDF link once complete. Poll about every 20 seconds; most orders finish in one to three minutes. | {"order_id": "<uuid from order_title_search>"} |
| get_report(order_id) | The finished report as structured JSON with the PDF link: owner, deeds, mortgages and releases, liens, courts, tax and flood for a title search; every federal list with distances for the environmental report. | {"order_id": "<uuid>"} |
| get_sample_report(report_type?) | A real finished report to look at first: 350 Fifth Avenue (title search) or 300 Bond Street, Brooklyn (environmental). | {"report_type": "environmental"} |
| list_products() | Every product on the server with a one-line description and its tools. | {} |
| get_terms() | Terms, privacy, refund policy and what each report and lookup is and is not. | {} |
Free environmental and flood lookups
Any US street address, from federal flood and environmental records. Screening lookups: not an official flood zone determination and not a Phase I Environmental Site Assessment.
| Tool | What it does | Example arguments |
|---|---|---|
| flood_zone_lookup(address) | The FEMA flood zone at the address's geocoded point, what it means for flood insurance and base flood elevation where published. | {"address": "1 Main St, Houston, TX 77002"} |
| superfund_sites_near_address(address) | Superfund National Priorities List sites within 3 miles with status, distance and direction, plus counts of other Superfund sites within 1 mile and EPA-regulated facilities within 0.5 mile. | {"address": "300 Bond St, Brooklyn, NY 11231"} |
| superfund_sites_by_state(state, county?, status?, limit?) | Every NPL site in a state with status and dates, the county breakdown and the state's rank, plus storage tank, brownfield and radon counts. Data updated nightly. | {"state": "NJ", "county": "Middlesex", "status": "final"} |
| superfund_states_summary() | NPL counts for all 50 states and DC with national totals. | {} |
Free property record lookups
Official city and county records for one address. People's names are shown as initials; a record that cannot be retrieved is reported as unavailable, never as nothing found.
| Tool | What it does | Example arguments |
|---|---|---|
| building_records_lookup(city, address) | Code violations and building permits on record with the city: Chicago, Philadelphia, Cincinnati, Mesa, Glendale (AZ), Gilbert, Buffalo and Provo. | {"city": "chicago", "address": "233 S Wacker Dr"} |
| property_history_lookup(place, address) | Deeds, sale prices, mortgages and releases recorded against the parcel, by year and type: New York City, Philadelphia, Cook County IL, Hamilton County OH and Utah County UT. | {"place": "philadelphia", "address": "1702 Ellsworth St"} |
Free surplus funds and tax sale lists
Rows from the official lists, updated nightly from official county records, with the statute and the office's own claim or bidding rules. HeritageDeed does not file claims, run auctions or bid for anyone.
| Tool | What it does | Example arguments |
|---|---|---|
| surplus_funds_search(state, county?, min_amount?, sort?, page_number?, per_page?) | Surplus (excess proceeds) still on the list after tax deed and foreclosure sales: case, parcel, address, amount and claim deadline. The first 10 rows of each county; the full list needs HeritageDeed Pro on the county page. | {"state": "FL", "county": "Duval", "min_amount": 5000} |
| surplus_funds_summary(state?) | Per county: rows, total, largest, the list's own date, the office and how to claim. | {"state": "FL"} |
| tax_sale_search(state, county?, sort?, page_number?, per_page?) | Properties on tax deed, tax lien and sheriff sale lists with sale dates and published amounts. The first 10 rows of each county; the full list needs HeritageDeed Pro on the county page. | {"state": "SC", "county": "Horry"} |
| tax_sale_summary(state?) | Per county: rows, next and last sale dates, the office, the bidding and redemption rules. | {"state": "NY"} |
Free closing cost calculators
The same numbers as the calculator pages, from the published rate schedules and statutes. Estimates, not quotes.
| Tool | What it does | Example arguments |
|---|---|---|
| title_insurance_premium(state, owner_amount, loan_amount, ny_county?, ny_zone?, pa_homeowner?, fl_prior_policy?) | Owner's and lender's policy premiums for Texas, Florida, Pennsylvania and New York, line by line with the rule applied. | {"state": "TX", "owner_amount": 400000, "loan_amount": 320000} |
| transfer_tax(place, price, kind?, mortgage?) | Transfer taxes and who customarily pays: NYC, New York State, Florida, Philadelphia, Chicago, Cook County, North Carolina, South Carolina, Arkansas, Texas, Arizona. | {"place": "nyc", "price": 1200000} |
| seller_net_sheet(place, price, payoff?, commission_pct?, loan_amount?,...) | Seller net proceeds and buyer closing costs for Florida, Texas, NYC, the rest of New York and Philadelphia. | {"place": "fl", "price": 400000, "payoff": 200000, "commission_pct": 5, "loan_amount": 320000} |
Free county data: loan limits, rents, property tax
Every one of the 3,144 counties in the 50 states and DC, from official federal figures, each with its effective date.
| Tool | What it does | Example arguments |
|---|---|---|
| county_loan_limits(state, county) | Conforming loan limit, FHA loan limit and VA county loan limit for one US county (any of the 3,144 counties in the 50 states and DC), for 1 to 4 unit homes, for the year in effect today, plus next year's once published. | {"state": "TX", "county": "Harris"} |
| national_loan_limits() | This year's national loan limit figures (conforming baseline and high-cost ceiling, FHA floor and ceiling, for 1 to 4 units), next year's once announced, and each state's lowest and highest county limits. | {} |
| fair_market_rent_by_county(state, county) | Fair Market Rents (studio to 4 bedrooms, monthly) for one US county, for the current fiscal year and the previous one, which year is in effect, and the 90-110% voucher payment standard range. | {"state": "NY", "county": "Kings"} |
| fair_market_rent_by_zip(zip_code) | Small Area Fair Market Rents for a 5-digit ZIP code (studio to 4 bedrooms, current and previous fiscal year), with the 90-110% payment standard range and whether the metro is one of the 65 designated Small Area FMR areas. | {"zip_code": "11215"} |
| property_tax_rate_by_county(state, county) | Effective property tax rate for one US county (median real estate taxes paid / median home value, 5-year household survey estimates), with the state and US rates, the county's rank in its state and nationally, and its neighbours. | {"state": "TX", "county": "Harris"} |
| property_tax_rates_by_state() | Effective property tax rates of the 50 states and DC, ranked highest first (1 = highest), with median taxes and home values, the US rate, and the counties with the highest and lowest rates. | {} |
| property_tax_rate_by_zip(zip_code, home_value?) | Effective property tax rate for a 5-digit ZIP code (ZIP Code Tabulation Area, 5-year household survey medians), with the US rate. | {"zip_code": "07030", "home_value": 650000} |
Free lending lookups
Any US street address: USDA property eligibility, census tract designations and Opportunity Zones. Not official determinations.
| Tool | What it does | Example arguments |
|---|---|---|
| usda_eligibility_lookup(address) | Is a US street address in a USDA Rural Development eligible area (the property-location test for USDA Single Family Housing Direct and Guaranteed loans, Section 502, and Multifamily Housing)? | {"address": "424 S Elm St, Lusk, WY 82225"} |
| census_tract_lookup(address) | Census tract of a US street address with the designations lenders and tax-credit programs use: the 11-digit tract GEOID (2020 boundaries), the 2026 tract income level (low / moderate / middle / upper, from the tract median family income as a percent of the area median) and Qualified Census Tract and Difficult Development Area status. | {"address": "2700 Martin Luther King Jr Ave SE, Washington, DC 20032"} |
| opportunity_zone_lookup(address) | Is a US street address in a designated Qualified Opportunity Zone? | {"address": "1 Main St, Houston, TX 77002"} |
Free hazard lookups
Radon for every county and ZIP code, mapped faults and transmission lines near an address. Screening facts, not a geotechnical or EMF assessment.
| Tool | What it does | Example arguments |
|---|---|---|
| radon_lookup(address?, zip_code?) | Radon for a US street address or a 5-digit ZIP code: the county's EPA radon zone (Zone 1 = predicted average indoor screening level above 4 pCi/L, Zone 2 = 2-4, Zone 3 = below 2; EPA's 1993 county map) and the radon test results on file for the county. | {"zip_code": "50309"} |
| radon_by_county(state, county) | Radon facts for one US county without an address: EPA radon zone (with the note for counties renamed or created since 1993, and for Connecticut's planning regions the zones of the former counties their towns were in), and the radon test results on file. | {"state": "IA", "county": "Polk"} |
| radon_state_summary(state) | How many counties of a state are in EPA radon Zone 1, 2 and 3, and the counties with the highest median radon test result in laboratory data (2008-2017, counties with 20 or more tests). | {"state": "PA"} |
| fault_lines_near_address(address) | Mapped earthquake faults near a US street address: every mapped fault section within 5 miles, nearest first (name, section, distance in miles and feet, direction, age of the most recent movement from 'historic' (< 150 years) to 'undifferentiated Quaternary', slip rate). | {"address": "1350 State Highway 2, Wrightwood, CA 92397"} |
| power_lines_near_address(address) | High-voltage electric transmission lines (100 kV and above) near a US street address, every mapped line within 1 mile, nearest first, with distance in feet and miles, direction, voltage, owner as recorded and substations. | {"address": "13500 Foothill Blvd, Sylmar, CA 91342"} |
Free entity and ownership lookups
Business entities only, from official state registries; people are shown as initials, and a query that reads as a person's name is refused.
| Tool | What it does | Example arguments |
|---|---|---|
| llc_owner_lookup(query, mode?, state?) | Who owns / is behind an LLC or corporation, from official state registries. | {"query": "ESRT Empire State Building LLC", "mode": "name"} |
| nyc_landlord_lookup(address, borough) | NYC 'who is my landlord': the building's housing agency registration by address. | {"address": "2400 Davidson Ave", "borough": "bronx"} |
| hoa_lookup(address, community?) | Which homeowners' association (HOA / POA / condo association) may govern an address, from official state HOA registry records (Texas and Utah). | {"address": "12500 Circle C Rd, Austin, TX 78739"} |
| ucc_lien_search(name, where?) | UCC financing statements (and NYC federal tax lien notices) where a BUSINESS is the debtor. | {"name": "Publix Super Markets, Inc.", "where": "FL"} |
Investor tools: tax appeal, zoning, recent sales, tax sale due diligence
Cook County, New York City and Philadelphia assessor records, city zoning records and official sales records. The tax appeal pack is data, not representation.
| Tool | What it does | Example arguments |
|---|---|---|
| tax_appeal_deadlines(place?, township?) | Property tax appeal filing deadlines and the filing office. | {"place": "cook"} |
| check_tax_appeal_property(address, place, parcel_id?) | Check that a property can get a Property Tax Appeal Evidence Pack, before ordering. | {"address": "1222 Scoville Ave, Berwyn, IL", "place": "Cook"} |
| order_tax_appeal_evidence(address, place, parcel_id?, email?) | Order a Property Tax Appeal Evidence Pack (PDF + JSON): the parcel's assessment history, appeal outcomes on record, comparable sales, a neighborhood assessment-to-sale ratio check computed from the assessor's own data, and the filing deadline. | {"address": "1222 Scoville Ave, Berwyn, IL", "place": "Cook"} |
| get_tax_appeal_evidence(order_id) | The finished Property Tax Appeal Evidence Pack as JSON (assessments, appeals, comparable sales, ratio check, deadlines, anything NOT RETRIEVED) and its PDF link. | {"order_id": "HD-..."} |
| zoning_lookup(address, place) | Zoning district of a property in New York City, Chicago or Philadelphia, from the city's zoning records: the district (e.g. R6, C5-3, RM-1), overlays and special districts. | {"address": "350 5th Ave", "place": "Manhattan"} |
| recent_sales(area, zip_code?, page?) | Recently sold properties (address, sale date and price only; no buyer or seller names) from official city and county records, the last 90 days published: `area` = 'Manhattan', 'Brooklyn', 'Queens', 'Bronx', 'Staten Island', 'Cook' / 'Chicago' or... | {"area": "Brooklyn", "zip_code": "11215"} |
| start_tax_sale_due_diligence(record_ids?, state?, county?) | Start a tax sale due diligence batch: a per-parcel flag sheet of debts that can outlive the sale, where public records show them (NYC: unreleased federal tax liens, unpaid ECB penalties, past-due DOF charges; elsewhere each debt type is marked... | {"state": "NY", "county": "kings-county"} |
| get_tax_sale_due_diligence(job_id) | Status and result of a tax sale due diligence batch: per parcel, the debts found with amounts and the effect of the sale, every check's status (found / none found / not searched / did not answer) and the cited rules; plus CSV and PDF links. 'Not searched'... | {"job_id": "..."} |
Property Watch
Monitoring of recorded documents, owner changes, violations and official lists for properties in covered counties. Alerts, not protection: it cannot prevent fraud.
| Tool | What it does | Example arguments |
|---|---|---|
| property_watch_coverage(state?, county?) | Where HeritageDeed Property Watch works and what it checks there. | {"state": "PA", "county": "Philadelphia"} |
| create_property_watch(address, state, county, email, label?) | Start watching a property in a covered county for `email`. | {"address": "1702 Ellsworth St, Philadelphia", "state": "PA", "county": "Philadelphia", "email": " [email protected] "} |
| list_property_watch_events(access_key, watch_id?) | Read a watch list with its `access_key` ('wk_...', from create_property_watch or the dashboard link after '#k='). | {"access_key": "wk_..."} |
REST API
For software that orders for many users: a key-authenticated REST API with batches and signed webhooks. The MCP server itself stays keyless.
| Tool | What it does | Example arguments |
|---|---|---|
| rest_api_info() | How to use HeritageDeed's key-authenticated REST API (v1) instead of, or next to, this MCP server: base URL, how to get a free API key, authentication, endpoints, the live list of report types you can order, limits, signed webhooks, idempotency, batches... | {} |
Questions
Is there a title search API?
Yes. POST https://heritagedeed.com/api/v1/orders with report_type current_owner, the street address, state and county orders a Current Owner Search for a property in one of the 43 covered counties. The search runs against the county's official records and usually finishes in one to three minutes; GET /v1/orders/{id}/report returns the JSON and /pdf the PDF.
Can I order an O&E report through an API?
Yes. The Current Owner Search is an owner and encumbrance (O&E) report: owner of record and vesting deed, every deed, mortgage and release the county index returns with each mortgage matched to its release, recorded liens, lis pendens and UCC fixture filings, federal court and bankruptcy records matched to the owner, and tax status.
Is there a lien search API?
Recorded liens come back inside the Current Owner Search: liens, lis pendens and UCC filings the county index returns for the parcel and owner, plus open (unreleased) mortgages. It is not a nationwide lien database and it does not search state court judgment dockets unless the county page lists them.
How do I get an API key and what does it cost?
Ask for one at https://heritagedeed.com/developers/api-keys or with POST /v1/keys. Keys are free; orders are paid per report ($49 per title report and $29 per environmental report; $25 a title report with prepaid API credits, sold in packs of 10 for $250), with 25 orders a day and 300 a month per key. Without credits, an order returns a Creem checkout link at the normal price and the search starts once it is paid.
What are the rate limits?
60 requests a minute per key, 25 orders a day and 300 a month per key, at most 50 rows per batch, and per-IP ceilings. A 429 answer carries Retry-After. GET /v1/account shows your key's limits and usage.
How do webhooks work?
Give a webhook_url (https, public host) on an order, a batch or as the key's default. When an order completes or fails we POST a signed JSON event (order.completed, order.failed, order.refunded, batch.completed). The HeritageDeed-Signature header is an HMAC-SHA256 of the timestamp and raw body with your webhook secret. Failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 8 hours.
Can the PDF carry my company name?
Yes. PATCH /v1/account with white_label_name puts your company name in the brand position of the PDF cover for reports ordered afterwards. Every page still says the report was prepared by HeritageDeed, and the legal text is unchanged. Logos are not supported.
What may the API not be used for?
A HeritageDeed report is a search of public records, not title insurance, a title commitment, an abstract certified by a licensed abstractor or a legal opinion. Reports may not be used for any purpose covered by the Fair Credit Reporting Act, such as deciding a person’s eligibility for credit, insurance, employment, housing or tenancy.
Get a free API key
Order title searches (O&E reports) and environmental records reports from your own software. Free key; $49 per title report and $29 per environmental report, or $25 a title report with prepaid API credits, with per-key quotas.
Free tools without a key: flood zone lookup, Superfund sites near an address, property history lookup and the other tools.
HeritageDeed provides public-record search reports only. Reports do not constitute title insurance, an attorney opinion of title, or a title insurance commitment. Use of the API and the MCP server is subject to the Terms of Service.