This is the authoritative quick reference for building a POST /property/search request body. Use it whenever you generate a request body from a natural-language prompt. Validate every field name and every enum value against the tables below before emitting.
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 exact-match enumerated string filters. Use inList (multiple values) or equals (single value).
propertyTypeCategory values
Residential, Commercial, Industrial, Agricultural.
Residential propertyTypeDetail values — copy these verbatim
Single FamilySingle Family Residential (Assumed)Multi-FamilyMulti-Family DwellingResidential Income (Multi-Family)DuplexTriplexQuadruplexApartmentsApartment House (5+ Units)Apartment House (100+ Units)Highrise ApartmentGarden Apartment, Court Apartment (5+ Units)Cooperative BuildingCooperative UnitCondominium UnitCondominium BuildingResidential Condominium DevelopmentTownhouseMobile HomeVacant 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 prompt mentions a concept rather than a specific enum value, emit 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 the user's prompt contains one of the phrasings below, always emit the corresponding quicklist. These mappings are mandatory: omitting the quicklist drops the user's intent.
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" |
|
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 cannot be combined
These groups describe contradictory states. Pick one quicklist per group; combining them in quickLists matches zero records.
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.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.
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.Emit the corresponding quicklist.
Emit 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.
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.
Related Resources
Text Search Grammar Best Practices — guidance on choosing the right text-search operator (
equals,contains,startsWith,endsWith,inList,notInList,matches) for each Property Search field, including the field-specific restrictions onlegal.subdivisionName.
