This is the authoritative quick reference for building a POST /property/search request body. Validate every field name and every enum value against the tables below before sending a request.
Building filters — exact field names
The searchCriteria.building object accepts these fields and only these fields. Use the names below verbatim.
Field | Type | Use for prompts mentioning... |
| integer range | "bedrooms", "beds", "BR" |
| integer range | "bathrooms", "baths", "BA" |
| integer range | calculated bathroom count |
| integer range | "square feet", "sqft", "sf", "size", "living area" |
| integer range | "total area", "gross area" (only when explicitly asked) |
| integer range | "year built", "built in", "built between" |
| integer range | "stories", "floors" |
| integer range | "rooms" |
| integer range | "units" |
| integer range | "residential units" |
| integer range | "garage spaces", "parking spaces" |
For "square feet" / "sqft" / "sf" / "size" prompts, use livingAreaSquareFeet (heated/cooled space). Use totalBuildingAreaSquareFeet only if the prompt explicitly asks for total building area including non-living space (garage, porch, basement).
Range values use { "min": <number>, "max": <number> }; either bound may be omitted.
{
"building": {
"bedroomCount": { "min": 4 },
"livingAreaSquareFeet": { "min": 1800 },
"yearBuilt": { "min": 1950, "max": 1959 }
}
}
Property type filters — exact enum values
general.propertyTypeCategory and general.propertyTypeDetail are enumerated string filters with a closed value list. Use inList (multiple values) or equals (single value); the values below are the complete list, so partial matching is never needed.
propertyTypeCategory values
Residential, Commercial, Industrial, Agricultural.
Residential propertyTypeDetail values — copy these verbatim
Single Family
Single Family Residential (Assumed)
Multi-Family
Multi-Family Dwelling
Residential Income (Multi-Family)
Duplex
Triplex
Quadruplex
Apartments
Apartment House (5+ Units)
Apartment House (100+ Units)
Highrise Apartment
Garden Apartment, Court Apartment (5+ Units)
Cooperative Building
Cooperative Unit
Condominium Unit
Condominium Building
Residential Condominium Development
Townhouse
Mobile Home
Vacant Land
The value Garden Apartment, Court Apartment (5+ Units) is a single enum value that contains a comma — keep it as one string.
Concept → exact propertyTypeDetail.inList expansion
When a search describes a concept rather than a specific enum value, include the full inList of every value below. Always include every value in the expansion; never collapse to a single representative value.
"single family" / "SFR" / "single-family home" / "house" / "home" (when used as a property type):
"propertyTypeDetail": {
"inList": ["Single Family", "Single Family Residential (Assumed)"]
}
"multi-family" / "multifamily" / "multi family":
"propertyTypeDetail": {
"inList": [
"Multi-Family",
"Multi-Family Dwelling",
"Residential Income (Multi-Family)",
"Duplex",
"Triplex",
"Quadruplex",
"Apartments",
"Apartment House (5+ Units)",
"Apartment House (100+ Units)",
"Highrise Apartment",
"Garden Apartment, Court Apartment (5+ Units)",
"Cooperative Building",
"Cooperative Unit"
]
}
"condo" / "condominium" / "condos":
"propertyTypeDetail": {
"inList": [
"Condominium Unit",
"Condominium Building",
"Residential Condominium Development"
]
}
"townhouse" / "townhome":
"propertyTypeDetail": { "equals": "Townhouse" }
"mobile home" / "manufactured home":
"propertyTypeDetail": { "equals": "Mobile Home" }
"vacant land" / "land":
"propertyTypeDetail": { "equals": "Vacant Land" }
When the prompt does not name a property type, omit general.propertyTypeCategory and general.propertyTypeDetail entirely. Do not add filters the user did not request.
Unit-count prompts use building.unitCount, not propertyTypeDetail
When the user specifies a number of units ("2+ unit residential", "3-unit", "4 or more units", "buildings with at least 5 units"), encode the count as a numeric range on building.unitCount (or building.residentialUnitCount if the prompt is residential-specific). propertyTypeDetail is an exact-match enum of named property types — it does not accept count-style values, and a unit-count expression belongs in the building filters, not the property-type filter.
{
"building": {
"unitCount": { "min": 2 }
}
}
If the user mentions both a unit count and a property-type concept ("2+ unit residential properties"), pair the building.unitCount filter with the multi-family propertyTypeDetail expansion above.
Quicklists — valid named filters
Use quickLists (AND semantics) or orQuickLists (OR semantics). Prefix with not- to negate (e.g. not-owner-occupied).
Quicklist | Meaning |
| Owner resides at property |
| Owner does not reside at property (umbrella — covers in-state and out-of-state) |
| Absentee owner with mailing address in same state |
| Absentee owner with mailing address in different state |
| Owner resides out of state |
| Property and mailing address match |
| Owned by corporate entity |
| Owned by a trust |
| Property was inherited |
| Owner is 65+ or has senior exemption |
| Last purchase was all cash |
| Bought and sold within 12 months |
| SFR owned 10+ years, built 30+ years ago |
| No mortgage on property |
| Owner has >20% equity |
| Owner has <20% equity |
| Equity cannot be determined |
| Loan default notice filed |
| Foreclosure sale notice filed |
| Pending lawsuit on property |
| Property in pre-foreclosure |
| In tax default for 3+ years |
| Property has upcoming auction date |
| Has involuntary lien |
| Property has active listing |
| Property has pending listing |
| Property listing has expired |
| Property listing was canceled |
| Listing was canceled or expired without sale |
| FSBO listing |
| Listed below estimated market value |
| Property is available for sale |
| Sold within last 12 months |
| USPS flagged as vacant |
| Likely a vacant lot |
| Owner's mailing address is vacant |
| Part of HOA |
| Has HOA fees |
Use the umbrella absentee-owner when the user says "absentee" without specifying in-state vs out-of-state. The in-state and out-of-state variants are subsets — picking only one of them silently drops the other half.
Required quicklists for canonical phrasings
When a search uses one of the phrasings below, always include the corresponding quicklist. These mappings are mandatory: omitting the quicklist drops the intent of the search.
User phrasing | Required quicklist |
"owner-occupied" / "owner occupied" / "occupied by owner" / "owner-occupant" / "owner is the resident" |
|
"absentee" / "absentee owner" / "owner does not live there" |
|
"vacant" / "unoccupied property" / "USPS-vacant" |
|
"high equity" / "lots of equity" / ">20% equity" / "equity-rich" |
|
"low equity" / "<20% equity" / "underwater" / "thin equity" |
|
"free and clear" / "no mortgage" / "paid off" / "mortgage-free" |
|
"cash buyer" / "purchased with cash" |
|
"corporate-owned" / "LLC-owned" / "owned by a company" |
|
"trust-owned" / "owned by a trust" |
|
"inherited" / "passed down" / "estate property" |
|
"preforeclosure" / "pre-foreclosure" |
|
"tax default" / "tax-delinquent for 3+ years" |
|
"fix and flip" / "flipped within 12 months" |
|
"tired landlord" |
|
"FSBO" / "for sale by owner" |
|
"listed below market" / "below market price" |
|
"senior owner" / "owner is 65+" |
|
"has HOA" / "HOA property" |
|
"involuntary lien" / "has a lien" |
|
"mailing address equals property address" / "mail goes to the property" |
|
"mailing address is different from property" / "mail goes elsewhere" / "off-site mailing" |
|
For "mailing address is different from the property", use the not- prefix on the existing quicklist (not-same-property-and-mailing-address). There is no different-property-and-mailing-address quicklist, and no mailingAddressHash workaround is needed.
These are independent of any other filters in the prompt. For example, "owner-occupied homes in Austin with high equity" requires both owner-occupied and high-equity in quickLists. Do not drop a required quicklist because another filter (property type, location, range filter) is also present.
Quicklists that should not be stacked
Quicklists combine with AND. Pick one quicklist per group below: a contradictory pair (such as owner-occupied with absentee-owner) matches zero records, and a subset pair (such as absentee-owner with out-of-state-absentee-owner) simply narrows to the subset, so name the single most specific list instead.
Owner occupancy: pick exactly one of
owner-occupied/absentee-owner/in-state-absentee-owner/out-of-state-absentee-owner/out-of-state-owner.Equity: pick exactly one of
high-equity/low-equity/unknown-equity.free-and-clear(no mortgage) is compatible withhigh-equityand adding both just narrows tofree-and-clear, so usefree-and-clearalone when the customer means no mortgage.Listing state: pick exactly one of
active-listing/pending-listing/expired-listing/canceled-listing/failed-listing.Market state: pick exactly one of
on-market/recently-sold.
If the user's prompt itself contradicts (e.g. "owner-occupied absentee owner"), pick the more specific filter; do not emit both.
Owner tenure and equity — numeric range filters (not quicklists)
Some concepts have no quicklist and must be expressed as numeric range filters:
Prompt phrasing | Field | Filter |
"owned for N+ years" / "lived there N+ years" / "long-term owner" |
|
|
"owned for less than N years" / "recent owner" |
|
|
tenure expressed in months ("owned 18+ months") |
|
|
"negative equity" / "underwater" / "owes more than it's worth" / "upside-down mortgage" |
|
|
There is no negative-equity quicklist; do not invent one. low-equity means under 20% equity, which is a different (and less extreme) concept than negative equity, so do not substitute it for "underwater". Use the valuation.equityPercent numeric filter.
Time-window prompts — pair the quicklist with a date range
When a prompt mentions a time window for a foreclosure, listing, or sale event ("notice of default in last 90 days", "auction in March", "sold this year", "listed Jan 1 to Jan 31"), the quicklist alone is not enough. You must:
Resolve the window to absolute
minDate/maxDatevalues from today's date inYYYY-MM-DDformat.Include the corresponding quicklist.
Include the matching DateRange filter on the correct field.
Phrasing | Quicklist | DateRange field |
"notice of default" + window |
|
|
"notice of sale" + window |
|
|
"lis pendens" + window |
|
|
"auction" + window |
|
|
"sold" / "recently sold" + window |
|
|
"active listing" / "on market" + window |
|
|
"sold on MLS" / "MLS sold" + window |
|
|
"failed listing" / "canceled listing" / "expired listing" + window |
|
|
"pending listing" + window |
|
|
Example: notice of default in last 90 days (assuming today is 2026-04-22)
{
"searchCriteria": {
"query": "Miami, FL",
"quickLists": ["owner-occupied", "notice-of-default"],
"building": {
"livingAreaSquareFeet": { "min": 1800 }
},
"foreclosure": {
"recordingDate": {
"minDate": "2026-01-22",
"maxDate": "2026-04-22"
}
}
}
}
Compute minDate / maxDate from the actual current date when generating a body — never use placeholder or training-cutoff dates.
Intel filters — BatchRank sale propensity (searchCriteria.intel)
BatchRank sale-propensity filtering lives in the searchCriteria.intel group. There is no flat, top-level propensity field and no min_sale_propensity / max_sale_propensity parameter — those names do not exist in the API.
Prompt phrasing | Field | Filter |
"BatchRank score between X and Y" / "sale propensity X to Y" |
|
|
"high propensity to sell" / "most likely to sell" / "highest BatchRank" |
| a high floor such as |
Key facts:
salePropensityis a 0 to 100 percentile rank, not a probability. A score of 82 ranks higher than 82% of all scored properties. Bounds are inclusive viamin/max.To get the score back in the response you must request the
batchrankdataset underoptions.datasets.datasetsbelongs underoptions, never at the request root — a root-leveldatasetskey is silently ignored.Sorting by
salePropensityis NOT supported. The sort field is a closed enum and does not include it, so"sort": { "field": "intel.salePropensity" }is invalid. Express "highest propensity" as a highminbound instead.There is no
high-sale-propensityquicklist. Do not invent one; use the numeric range.intel.salePropensityCategory(High/Medium/Low) andintel.salePropensityStatusare response fields from thebatchrankdataset, not search filters.
Example: Phoenix properties with a BatchRank score of 70-95
{
"searchCriteria": {
"query": "Phoenix, AZ",
"intel": {
"salePropensity": { "min": 70, "max": 95 }
}
},
"options": {
"skip": 0,
"take": 100,
"datasets": ["core", "batchrank"]
}
}
Worked examples
Multi-family in Boston, low equity, 4+ bedrooms, built in 1950s
{
"searchCriteria": {
"query": "Boston, MA",
"quickLists": ["low-equity"],
"general": {
"propertyTypeCategory": { "equals": "Residential" },
"propertyTypeDetail": {
"inList": [
"Multi-Family",
"Multi-Family Dwelling",
"Residential Income (Multi-Family)",
"Duplex",
"Triplex",
"Quadruplex",
"Apartments",
"Apartment House (5+ Units)",
"Apartment House (100+ Units)",
"Highrise Apartment",
"Garden Apartment, Court Apartment (5+ Units)",
"Cooperative Building",
"Cooperative Unit"
]
}
},
"building": {
"bedroomCount": { "min": 4 },
"yearBuilt": { "min": 1950, "max": 1959 }
},
"valuation": {
"estimatedValue": { "min": 50000, "max": 2000000 }
}
}
}
Condos in Nashville, free and clear, 3+ bedrooms, built 1980-2000
{
"searchCriteria": {
"query": "Nashville, TN",
"quickLists": ["free-and-clear"],
"general": {
"propertyTypeCategory": { "equals": "Residential" },
"propertyTypeDetail": {
"inList": [
"Condominium Unit",
"Condominium Building",
"Residential Condominium Development"
]
}
},
"building": {
"bedroomCount": { "min": 3 },
"yearBuilt": { "min": 1980, "max": 2000 }
},
"valuation": {
"estimatedValue": { "min": 50000, "max": 2000000 }
}
}
}
Notice of sale in Atlanta, valued $150K-$400K, 1500+ sqft
{
"searchCriteria": {
"query": "Atlanta, GA",
"quickLists": ["notice-of-sale"],
"valuation": {
"estimatedValue": { "min": 150000, "max": 400000 }
},
"building": {
"livingAreaSquareFeet": { "min": 1500 }
}
}
}
When the prompt does not name a property type, do not add general.propertyTypeCategory or general.propertyTypeDetail — leave them out, as in this example.
Request Options (pagination & sessions)
These optional fields live under options on a Property Search request.
Default paging (small result sets):
skip(integer, default 0) — number of records to skip.take(integer, default 25, sync max 100 / async max 1000) — number of records to return on this page. Passingtake: 0returns aggregate data only (counts, summaries) and is billed for one property record at the request's resolved dataset rate (the basic property dataset rate if no dataset resolves).takevalues greater than 0 are billed only for the records actually returned, with no minimum charge; a request that returns no matching properties is not charged.
Exceeding the cap returns a 400 whose message states the limit explicitly, e.g. "The options.take must not be greater than 100." on sync /property/search and "The options.take must not be greater than 1000." on /property/search/async. If a caller reports a different limit than the one above, follow the number in the API's own error message rather than restating a fixed value.
Retrieving large volumes (tens of thousands of records). Do not deep-page with bare skip/take — skip-based deep paging is unstable as the index shifts underneath you, so rows can be duplicated or missed between pages as results move across page boundaries. In descending order of preference:
Cursor pagination —
options.useCursorPagination: true, then round-tripnextPageCursorasoptions.pageCursor. Stable across data changes; see below.A search session — for incremental delivery across days or weeks without paying for the same property twice; see below.
The async endpoint —
POST /property/search/asyncacceptstakeup to 1000 and delivers tooptions.webhookUrl; combine it withuseCursorPaginationfor stable pages. These options are not mutually exclusive.
Arithmetic for 50,000 records: ~500 requests against sync at take: 100 (cursor pagination makes the same number of requests, but pages stably), or ~50 against async at take: 1000. Request count is rarely the binding constraint — billing is per record returned, not per request, and the rate limit is 3,000 requests per minute per account — so prefer cursor pagination for stability rather than to save requests. The MCP tools' 10-results-per-page behaviour is a tool-layer limit and must never be quoted as an API limit or used to compute request counts for someone building their own integration.
Cursor pagination (stable paging through large result sets; supported on both sync /property/search and async /property/search/async — on async, the webhook payload carries results.nextPageCursor in the same shape):
useCursorPagination(boolean, default false) — whentrue, the response includesnextPageCursor(andpreviousPageCursoron subsequent pages). Cannot be combined withsort.sortOrder: "random". Required whensearchSessionis set.pageCursor(string, opaque, optional) — pass the value ofnextPageCursor(orpreviousPageCursor) from the previous response verbatim to retrieve the next (or previous) page. Treat as a black box: do not parse, modify, or generate. Cursors are bound to the originalsearchCriteria; reusing one against different criteria returns 400. Mutually exclusive withsearchSession(the session owns the cursor).
Search session (named, persistent delivery context across requests, sync /property/search only):
searchSession.id(required string, regex^[a-zA-Z0-9_-]{1,128}$, max length 128) — customer-chosen session id, scoped to your account. Two accounts may use the same id without interference.searchSession.idempotencyKey(optional string, same regex) — when supplied, an identical retry carrying the same key against a session that has already advanced returns 409 without re-advancing the session. Use for queue workers, webhook retries, CI jobs.
Constraints (verbatim 400 error strings):
"Invalid request. searchSession requires useCursorPagination to be true.""Invalid request. searchSession cannot be combined with pageCursor.""Invalid request. skip and cursor cannot be used together.""Invalid request. searchSession is not supported on async endpoints."
Token ability required for sessions: property-search-sessions (also gates GET /api/v2/property/search-sessions and DELETE /api/v2/property/search-sessions/{id}). 100 sessions max per account.
Response fields added on Property Search:
nextPageCursor/previousPageCursor— present whenuseCursorPagination: trueand no session is set.searchSessionMeta— present whenoptions.searchSessionwas set. ContainsisNewSession(boolean) andtotalDelivered(integer). When this object is present,nextPageCursor/previousPageCursorare deliberately suppressed.
Example — session-backed paging:
{
"searchCriteria": { "query": "Phoenix, AZ" },
"options": {
"take": 100,
"useCursorPagination": true,
"searchSession": {
"id": "monthly-leads-az-85020"
}
}
}
Wildcard-restricted fields — contains/startsWith/endsWith return HTTP 400
contains, startsWith, and endsWith return an HTTP 400 error naming the field and operator on the high and medium cardinality text fields listed below. On these fields use equals, inList, notInList, or matches instead.
owner:firstName,lastName,middleName,fullName,mailingStreet,mailingCity,mailingAddressHashpreviousOwner:fullNameaddress:street,streetNoUnit,formattedStreet,city,locality,county,cbsaTitle,csaTitleids:apn,taxId,addressHash,mailingAddressHash,propertyIdlot:zoningCodedemographics:demographicspermit:allTagslegal:subdivisionNamesale:lastSaleTransactionTypeCode,priorSaleTransactionTypeCode(low-cardinality code fields that are restricted as well)
owner.firstName and owner.lastName additionally accept containsWords (see Owner-name search below). The wildcard operators remain available on the low-cardinality enumerated fields, for example address.state, address.zip, property type, and most other status and type enums. Note the restriction applies to the text title fields (address.cbsaTitle, address.csaTitle), not to their numeric code counterparts.
matches is a complete-value operator like equals, not a partial-match substitute. matches appears in the replacement list above because it is still accepted on every field in it. It will not match a fragment of a stored value, and matches with more than one value behaves differently from field to field and returns zero on several of them, so use inList to match any of several values.
Never offer matches as a partial-name or keyword workaround, on any string field. It requires the complete stored value, so a fragment returns zero results with an HTTP 200, and nothing in the response signals the query was wrong. When only part of a value is known, route to equals or inList with complete values, or to containsWords on owner.firstName and owner.lastName, which is the one tokenized owner-name operator.
Supply exactly one operator per field. If a field carries more than one operator, the API applies one and silently discards the rest, with HTTP 200 and no error or warning in the response. Of the eight text operators matches ranks last, so on a field that accepts matches, a matches clause paired with any other operator is the one that gets dropped. The loan-type fields do not accept matches at all, so supplying it there makes the request fail instead; these are the openLien loan-type fields (allLoanTypes, juniorLoanTypes, and firstLoanType through fourthLoanType). The silent discard applies when the field accepts every supplied operator: if any supplied operator is not accepted on the field, the request fails instead, so a wildcard paired with equals on a restricted field still returns its HTTP 400. Two different operators on the same field cannot be combined in one request. To match any of several values, use inList.
Using legal.subdivisionName in practice
Filter Property Search to a known subdivision:
{
"searchCriteria": {
"legal": { "subdivisionName": { "equals": "Briarwood Estates" } }
}
}
Use inList to span a set of subdivisions, or notInList to exclude them.
Comparables in the subject's subdivision — use options.useSubdivision: true:
{
"searchCriteria": {
"compAddress": { "street": "...", "city": "...", "state": "...", "zip": "..." }
},
"options": {
"useDistance": true,
"distanceMiles": 1,
"useSubdivision": true
}
}
useSubdivision: true derives the subject's subdivision from compAddress automatically — equivalent to passing the subject's legal.subdivisionName in an equals filter, but simpler. Set the explicit legal.subdivisionName clause only when comparables in a different subdivision are needed, or inList across multiple.
If the customer only has a fragment of the subdivision name, look up any property known to be in the subdivision via Property Lookup and copy the response's legal.subdivisionName verbatim into the equals or inList clause. Do not paraphrase, lowercase, or trim it.
Owner-name search: containsWords on owner.firstName / owner.lastName
To find a property by its owner's name, use containsWords on owner.firstName and/or owner.lastName. It is a tokenized, order-insensitive, case-insensitive word match and is the supported replacement for wildcard matching on owner-name fields. When you supply both owner.firstName and owner.lastName, a property matches only if both names appear on the same owner record. When both names use containsWords, satisfying one name through one owner and the other through a second owner is not a match. Supplying a single name part matches it against either owner. The same-owner rule applies when both names use containsWords or both names use equals or inList. If you use containsWords for one name and equals or inList for the other, the API checks each name separately. The two names can then match two different owners on the same property. A search that uses containsWords on either name requires a location, such as a city and state, a ZIP code, or a full address. Without a location, the request returns HTTP 400. An owner-name search that uses only equals or inList does not require a location.
For a containsWords search, set options.ownerNameAddressMatchMode to control address handling:
standard(default): closest matching properties at the location with owner-name matching applied. Accepts a full address or a location query (city, county, or ZIP).exact: resolves the supplied structured address to the single parcel there (no widening). Requires a structured address plus an owner-namecontainsWordscriterion, and returnsmeta.results.ownerNameMatchcarryingmatchedParcelCount(the total, and the value to use for the zero / one / more-than-one decision),ownerNameMatchCountandtrustMatchCount(attributions explaining how those parcels were reached, which overlap rather than dividing the total between them), andmatchSource.standardomitsownerNameMatch.
Mapping common phrasings:
Search intent | Use |
"find properties owned by John Smith in Phoenix" |
|
"is John Smith the owner at 123 Main St?" |
|
"probate / estate: confirm the owner at this address" |
|
Confirm an owner at a specific address (exact mode):
{
"searchCriteria": {
"owner": {
"firstName": { "containsWords": "John" },
"lastName": { "containsWords": "Smith" }
},
"address": {
"street": { "equals": "123 Main St" },
"city": { "equals": "Phoenix" },
"state": { "equals": "AZ" },
"zip": { "equals": "85020" }
}
},
"options": { "ownerNameAddressMatchMode": "exact", "take": 1 }
}
Previous-owner search: previousOwner.fullName
searchCriteria.previousOwner.fullName matches a party against the seller of record on the property's past sales. Use it to find properties a party sold, as opposed to owner.*, which finds properties a party currently owns. The common case is a fix-and-flip investor or a company whose past sales the customer wants to study.
Operators. Supported: equals, inList, notInList, matches. Matching is case-insensitive. All four operators compare against the complete stored name, never against a fragment of it: matches is not a partial, prefix, or keyword search. Supplied with a single name it is identical to equals, and more than one value returns no results on this field, so use inList to match any of several names. containsWords is not supported on this field, so do not carry the owner-name recipe over to it. contains, startsWith, and endsWith return HTTP 400 like the other restricted string fields.
Limitation. State this in every answer that uses this filter. Matching applies to the seller of record on the two most recent sales only. It does not search a property's full ownership or transaction history, so a sale further back than that will not match. When a customer asks for everything a party has ever transacted, point them at Investor Profile rather than this filter.
Mapping common phrasings:
Search intent | Use |
"what properties did ACME Home Buyers sell in Phoenix" |
|
"find homes this flipper flipped" |
|
"properties previously sold by any of these companies" |
|
"everything this investor has ever bought and sold" | do NOT use this filter; route to Investor Profile |
"properties whose past seller name starts with ACME" | not supported; |
Properties a named party sold at a location:
{
"searchCriteria": {
"query": "Phoenix, AZ",
"previousOwner": {
"fullName": { "equals": "ACME HOME BUYERS LLC" }
}
},
"options": { "take": 25 }
}
Several parties at once (inList):
{
"searchCriteria": {
"query": "Maricopa County, AZ",
"previousOwner": {
"fullName": {
"inList": ["ACME HOME BUYERS LLC", "BLUE DOOR PROPERTIES LLC"]
}
}
},
"options": { "take": 50 }
}
Related Resources
Text Search Grammar Best Practices: guidance on choosing the right text-search operator for each Property Search field, including the field-specific restrictions on
legal.subdivisionNameandpreviousOwner.fullName.