Free-text property search
Find properties by a single free-text query — a full or partial address, an owner name, or a place. Results are ranked by relevance and tolerate typos, missing components, and reordered street directionals (e.g. "112 5th ave nw" and "112 nw 5th ave" both match). Returns the same property summary rows as the list endpoint. Use this for a search box; use the list endpoint for structured filtering.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/properties/search" \ -H "Content-Type: application/json" \ -d '{ "query": "string" }'{
"cursor": "string",
"data": [
{
"activeLoanCount": 0,
"activeLoanCountKnown": true,
"address": "string",
"apn": "string",
"avm": {
"confidence": 0,
"high": 0,
"low": 0,
"mid": 0
},
"baths": 0,
"beds": 0,
"borrowerStatus": "string",
"city": "string",
"coordinates": {
"lat": 0,
"lon": 0
},
"equity": {
"pct": 0,
"value": 0
},
"equityPlausible": true,
"fips": "string",
"foreclosure": {
"matched": true,
"scheduledAuctionDate": "string",
"status": "string"
},
"id": "string",
"loanCount": 0,
"loanType": "string",
"loans": [
{
"amount": 0,
"amountPlausible": true,
"borrowerStatus": "string",
"brokerNmls": "string",
"companyNmls": "string",
"currentBalance": 0,
"interestRate": 0,
"lenderId": "string",
"lenderName": "string",
"lenderNmls": "string",
"loanType": "string",
"ltv": 0,
"originatorName": "string",
"originatorNmls": "string",
"recordedInterestRate": 0,
"recordingDate": "string",
"transactionType": "string"
}
],
"lotSquareFeet": 0,
"mmPropertyId": "string",
"mortgageBalance": 0,
"mortgageBalancePlausible": true,
"ownerFirstName": "string",
"ownerLastName": "string",
"ownerName": "string",
"partialBaths": 0,
"preSaleLoanCount": 0,
"recordedInterestRate": 0,
"saleCount": 0,
"salePropensity": {
"category": "string",
"score": 0
},
"sales": {
"count": 0,
"firstDate": "string",
"lastDate": "string",
"lastPrice": 0
},
"scoredAt": "string",
"squareFeet": 0,
"state": "string",
"stories": 0,
"yearBuilt": 0,
"zip": "string"
}
],
"lenderNormalizations": [
{
"aliasCount": 0,
"displayName": "string",
"id": "string",
"matchedVia": "id",
"original": "string",
"totalDocuments": 0
}
],
"total": 0
}{
"error": "string"
}{
"error": "string"
}{
"error": "string"
}{
"error": "string"
}{
"error": "string",
"limit": 0,
"size": 0
}Resolve a batch of addresses to property ids POST
Resolve up to 2,000 postal addresses to property ids in one call — e.g. a mailing list before a bulk delivery. Free. Returns one result per input, in order, keyed by your `ref`. `matched` carries the parcel `id` and `mmPropertyId` — pass them to bulk delivery `propertyIds` or the list `flatFilters.id`, then join the rows back on `ref`. Each address is first matched on the normalized number + street + unit + zip key (suffix, directional, punctuation and case insensitive); misses fall back to a ranked search that only accepts a hit with the same house number, the same zip or city, and a near-identical street name. `ambiguous` lists `candidates`: `unit_required` (a building whose units are separate parcels — resend with the unit), `duplicate_parcels` (one address on several parcel records; usually safe to take them all), `multiple_parcels`. `not_found` gives a `reason`: `no_parcel_at_number` (no parcel at that house number in that zip/city), `low_confidence`, or an input problem (`no_house_number`, `no_street`, `no_location`).
Submit a bulk-delivery job for properties POST
Queues an ECS task that dumps every matching properties document to S3 in the requested format. Returns 202 with a jobId; poll `GET /v1/properties/bulk-delivery/{jobId}` for status + the signed download URL. **Row limit.** Deliveries of up to 5,000 rows need no entitlement. Above that, the org's `bulk-delivery.properties` entitlement is required and its scope (row ceiling, row filters, allowed fields) governs the delivery; without it the request is rejected with 403 `entitlement_missing`. Pass `limit` at or below the ceiling to deliver a capped subset of a broader query. Email support@modelmatch.com to request a limit increase. Delivery is billed at 1 credit per row regardless of entitlement (deliveries submitted from the ModelMatch web app are not billed). **Push-target destination.** Pass `destination: { type: "push-target", targetId }` to have the finished rows sent to a configured push target instead of downloaded. The target is checked before anything is queued; a refusal returns the push target's status and `code` (`TARGET_NOT_FOUND` 404, `FORBIDDEN` 403, `PLAN_REQUIRED` 402, `TARGET_DISABLED` 409, `ENTITY_MISMATCH` 400). Limits and billing are the same as a file delivery.