Real Estate API Questions

How do I enrich a list of addresses with property data by API?

6 minute readRealie

Quick Answer

Send each address to a property lookup API and write the fields it returns to that row. With Realie, Address Lookup takes a state and a street address, with county and unit optional, and returns one parcel record per call; an address with no match returns a 404 that is not billed. For a list concentrated in one county, a county search with cursor pagination can take fewer calls.

Get a Realie API key

Summary

Enriching an address list, also called match and append, turns each row into a matched parcel with its owner of record, assessment, tax, sale, mortgage, and boundary fields. Realie has no batch address endpoint, so there are three ways to run it: one Address Lookup call per row, a county walk with property search that you match locally, or bulk files loaded into your own warehouse. This page shows how to prepare the rows, what each lookup returns and counts against your plan, and when each approach takes fewer calls. For analyzing a finished file in ChatGPT, see the property CSV guide; for the API or bulk decision itself, see the API vs bulk delivery guide.

How does address enrichment work with a property API?

Each row goes through the same three steps: send the address, match it to one parcel, and append the fields you need to the row. Realie’s Address Lookup returns one property record per request, so each row is one request, and only the rows that match count as calls against your plan.

Address Lookup needs state and address, where address is the street line only, with no city, state, or ZIP code. The county parameter narrows the match, city also needs county, and unitNumberStripped picks one unit in a multi-unit building:

curl -H "Authorization: YOUR_API_KEY" "https://app.realie.ai/api/public/property/address/?state=TX&county=TRAVIS&address=504%20LAVACA%20ST"

From a script or a coding agent, the CLI runs the same lookup with --json output:

realie --json lookup --address "504 LAVACA ST" --state TX --county TRAVIS

A match returns the record as property, with parcelId and countyFips, the owner of record in propertyIdentification.currentOwner, assessment and tax in valuationInformation and taxInformation, recorded sales and mortgages, and the parcel boundary. An address with no match returns a 404, which is not billed; keep those rows in a separate list to review rather than dropping them.

How should I prepare the addresses before I call the API?

Split each row into the fields the endpoint takes: a two-letter state, the street line as address, and the county where you have it. Put a unit in unitNumberStripped without its designator, so APT 2B becomes 2B. Realie’s code reference library includes a Python helper, normalize_unit_number, that strips designators such as APT, STE, and UNIT.

Keep your own row ID and the address exactly as you sent it. Store the returned parcelId with the state and county next to the row, so a later refresh can use Parcel ID Lookup instead of matching the address again.

A multi-unit address sent without a unit returns one unit’s record as property, plus otherResults with up to 10 more records from the same query, and still counts as one call. Pass unitNumberStripped when your row has a unit, and use property search when you need every unit at an address.

For one address at a time, use Address Lookup rather than property search; Realie’s FAQ notes it is the quicker endpoint for individual address queries.

When does a county search take fewer calls than one lookup per address?

When most of your list sits in a few counties, walk each county instead of looking up each row. Property search returns pages of up to 100 parcels, and a page is one call whether it holds 1 parcel or 100, so a county takes about one call per 100 parcels in it. Compare the two counts before you choose: the rows you hold in a county against that county’s parcel count divided by 100. A short list in a large county still takes fewer calls one address at a time.

To walk a county, send state, county, limit=100, includeUnassignedAddress=true and cursor=start to property search, then pass each response’s metadata.nextCursor back as cursor until it is null. Without includeUnassignedAddress=true, search skips parcels that have no street address, which matters for rural and vacant land. A cursor walk filters by state, or by state and county, and nothing else, so do not add address or zipCode to it.

curl -H "Authorization: YOUR_API_KEY" "https://app.realie.ai/api/public/property/search/?state=TX&county=TRAVIS&limit=100&includeUnassignedAddress=true&cursor=start"

Then match your rows to the county’s records locally on the street address, unit, and ZIP code (address, propertyLocation.unitNumberStripped, and zipCode in each record). Send any row that does not match locally to Address Lookup.

When should I use bulk delivery instead of the API?

When your list covers whole states or most of the country, license bulk files and run the match inside your own warehouse. Realie licenses state, regional, or nationwide data on yearly contracts and delivers the files to AWS S3, Google Cloud Storage, or Azure Blob Storage.

Many teams keep both: the bulk files as the baseline and the API for rows added between deliveries. The API vs bulk delivery guide covers that decision in detail.

How many calls does an enrichment job use?

A call is one successful (200) request. On Address Lookup that is one call per matched row; on property search it is one call per page of up to 100 parcels. Responses other than 200, such as a 404 for an address with no match, are not billed.

Free includes 25 calls a month, $50/mo includes 1,250, $150/mo includes 6,000, $350/mo includes 30,000, and enterprise pricing at $600/mo includes 100,000. See Realie pricing for each plan, and run a sample of your rows on Free before you run the whole list.

Sources

Frequently asked questions

Does Realie have a batch address endpoint?
No. Address Lookup takes one address per request, so send one request per row, walk a county with property search and match the rows locally, or license bulk files when the list covers whole states.
Am I charged for addresses that do not match?
No. An address with no match returns a 404, and only successful (200) responses count against your plan. Keep the 404 rows and check them in Realie Explore (app.realie.ai/explore), which shows the matching parcels on a map.
How do I enrich apartment and condo addresses?
Send the unit in unitNumberStripped without its designator, such as 2B for APT 2B. Without a unit, a multi-unit address returns one unit’s record plus otherResults with up to 10 more from the same query, as one call. Property search returns every unit record at an address.
Can I run an enrichment from the command line or an AI agent?
Yes. The CLI command realie --json lookup takes the same parameters as Address Lookup, so a script can loop over your rows. In Claude, Cursor, and other MCP hosts, the address_lookup tool on the Realie MCP server runs the same lookup. Both use the same account and plan as REST.
Which fields can I append, and which can I not?
Each match carries the parcel ID, the owner of record and mailing address, assessed values and tax, recorded sales, mortgages and liens, zoning, building details, and the parcel boundary. Realie does not return owner phone numbers or emails, MLS listings or listing photos, or rent estimates.
Can I test an enrichment on the Free plan?
Yes. Free includes 25 calls a month, enough to check a sample of rows from your counties before you run the full list, and a 404 for an address with no match does not use one. New accounts add a payment method before generating an API key.