Skip to main content

About

Programmatic access to the property database: search by address, parcel, or MLS id, fetch property details and attributes, run your saved property filters, organize properties with tags and lists, and skip-trace owners. All operations go through the developer API gateway — one endpoint, called by operationId. If you haven’t set up a key yet, start with the Developer API Overview.
Property idsThe search operations (findProperties, findPropertiesByParcel, findPropertiesByMlsId) return the property id to use everywhere else — pass it as-is to getProperty, getRelatedProperties, tag/list operations, and skip tracing.

Operations

Lookup and search (READ scope)

Address/parcel/MLS searches are paginatedfindProperties, findPropertiesByParcel, and findPropertiesByMlsId return up to 50 matches per call (a larger limit is clamped) but take an offset, and return totalCount + hasMore — so you can page through the full result set: send offset: 0, then offset: 50, and so on until hasMore is false. See Result limits & truncation.

Saved filters (READ + WRITE scopes)

Read the tree before you edit part of itupdateFilter replaces root wholesale. Editing one condition without calling getFilter first means re-authoring the tree blind and silently dropping every condition you didn’t know was there. Read it, change the one condition you mean to change, and send the modified tree back.Both saveFilter and updateFilter validate field ids and value shapes strictly. Discover fields with listFilterFieldNames, fetch the selected fields’ exact union arms with listFilterFields(fieldIds: [...]), and re-read the saved tree with getFilter after updating.
Relay filter warningsA successful save or update can return warnings. These are not errors: the filter was persisted, but its criteria may deserve attention — for example, selecting same-named counties from different states. Show every warning to the user and correct the tree if it reveals an unintended selection.
Cities and counties are identified by id, not by nameA cityFilters condition takes the id from searchCities as its value (with label set to "Name, ST", e.g. "Memphis, TN"), and a countyFilters condition takes the 5-digit fips from searchCounties. saveFilter and updateFilter reject a bare city or county name: 11,347 US city names occur in more than one state, and a county name compiles to a county_fips term that would match nothing. Resolve the name to an id first.

Tags and lists (READ + WRITE scopes)

Skip tracing (ADMIN scope)

Credit-spending operationsSkip-trace operations spend your organization’s credits, so they require the ADMIN scope and the key owner must currently be a team admin. For high-volume server-to-server skip tracing there is also the standalone Skip Trace API.
Properties are global, not org-ownedUnlike deals or contacts, a property isn’t owned by any one organization — it’s shared reference data. So property operations are not org-guarded on the property id: any valid property id (esId) is readable, and referencing one never returns 403 forbidden. Your scope (READ / WRITE / ADMIN) still gates what you can do. The tags and lists you organize properties with are yours, though — a tag or list id from another org returns 403 forbidden. Saved filters you create are tied to your organization by the key. See Authorization for the model.

Example

Run a saved filter and page through the matches:
Full variable schemas, response shapes, and worked examples for every operation are available from the discovery endpoint.