Skip to main content
POST
/
v1
/
properties
/
search
curl -X POST "https://api.v2.dealmachine.com/v1/properties/search" \
  -H "Authorization: Bearer dm_sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "locations": [
      { "type": "county", "code": "48201" },
      { "type": "county", "code": "48113" }
    ],
    "anchor": "properties",
    "contact_audience": "owners",
    "filters": [
      {
        "filter_id": "estimated_value",
        "operator": "range",
        "value": { "min": 200000, "max": 600000 }
      },
      {
        "filter_id": "has_absentee_owners",
        "value": true
      }
    ],
    "fields": [
      "estimated_value",
      "equity_percent",
      "bedrooms"
    ],
    "page": 1,
    "per_page": 25,
    "sort": [
      { "field_id": "estimated_value", "direction": "desc" }
    ]
  }'
{
  "data": [
    {
      "dm_property_id": "prop_a1b2c3",
      "full_address": "1200 Barton Springs Rd, Austin, TX 78704",
      "address": "1200 Barton Springs Rd",
      "unit": null,
      "city": "Austin",
      "state": "TX",
      "zip": "78704",
      "latitude": 30.2598,
      "longitude": -97.7544,
      "images": {
        "street_view": "https://next.v3.dealmachine.com/map/streetview?...",
        "satellite": "https://next.v3.dealmachine.com/map/satellite?...",
        "roadmap": "https://next.v3.dealmachine.com/map/staticmap?..."
      },
      "estimated_value": 575000,
      "equity_percent": 72,
      "num_bedrooms": 4,
      "num_bathrooms": 2,
      "living_area_sqft": 2200,
      "contacts": [
        {
          "dm_person_id": "per_67890",
          "full_name": "John Smith",
          "first_name": "John",
          "last_name": "Smith",
          "is_likely_owner": true,
          "is_in_owner_family": false,
          "is_resident": true,
          "is_likely_renter": false,
          "phones": [
            { "number": "5125551234", "type": "wireless", "do_not_call": false }
          ],
          "emails": [
            { "address": "john.smith@example.com" }
          ]
        }
      ]
    }
  ],
  "totals": {
    "properties": 1847,
    "people": 2134
  },
  "credits": {
    "used": 26,
    "properties": 25,
    "people": 1,
    "deduplicated": 0
  },
  "pagination": {
    "page": 1,
    "per_page": 25,
    "total_results": 1847,
    "total_pages": 74,
    "has_next_page": true,
    "has_previous_page": false
  }
}
Search the DealMachine property database using filters. Control which fields are returned, how results are paginated and sorted, and whether contacts are included.

Body Parameters

locations
array
required
Array of location objects defining where to search. At least one location is required (max 15). Locations use OR logic — results matching any location are included.
filters
array
required
Array of filter objects. At least one filter is required. You can mix property filters (source_type=properties) and people filters (source_type=people).
fields
string[]
Field IDs to include in results. Can include both property and people fields. Omit or pass an empty array for the default set.
anchor
string
default:"properties"
Controls the shape of the response.
  • properties — Results are properties. Contacts are nested in a contacts array. See Anchor Behavior.
  • people — Results are people. Requires contact_audience. Each person includes a residence (where they live) and a nested property (the associated property).
contact_audience
string
default:"owners"
Which contacts to include. Required when anchor is people. Defaults to "owners" when anchor is "properties".Options: owners, owners_and_family, renters, residents, noneSet to "none" to explicitly opt out of contacts. When "none", no contacts array is included and no contact credits are charged.
page
integer
default:1
Page number (min: 1).
per_page
integer
default:25
Results per page (min: 1, max: 250).
sort
array
Array of sort objects for ordering results. See Pagination & Sorting.
estimate_cost
boolean
default:false
When true, returns a credit cost estimate without returning data or consuming credits. See Cost Estimate.

curl -X POST "https://api.v2.dealmachine.com/v1/properties/search" \
  -H "Authorization: Bearer dm_sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "locations": [
      { "type": "county", "code": "48201" },
      { "type": "county", "code": "48113" }
    ],
    "anchor": "properties",
    "contact_audience": "owners",
    "filters": [
      {
        "filter_id": "estimated_value",
        "operator": "range",
        "value": { "min": 200000, "max": 600000 }
      },
      {
        "filter_id": "has_absentee_owners",
        "value": true
      }
    ],
    "fields": [
      "estimated_value",
      "equity_percent",
      "bedrooms"
    ],
    "page": 1,
    "per_page": 25,
    "sort": [
      { "field_id": "estimated_value", "direction": "desc" }
    ]
  }'
{
  "data": [
    {
      "dm_property_id": "prop_a1b2c3",
      "full_address": "1200 Barton Springs Rd, Austin, TX 78704",
      "address": "1200 Barton Springs Rd",
      "unit": null,
      "city": "Austin",
      "state": "TX",
      "zip": "78704",
      "latitude": 30.2598,
      "longitude": -97.7544,
      "images": {
        "street_view": "https://next.v3.dealmachine.com/map/streetview?...",
        "satellite": "https://next.v3.dealmachine.com/map/satellite?...",
        "roadmap": "https://next.v3.dealmachine.com/map/staticmap?..."
      },
      "estimated_value": 575000,
      "equity_percent": 72,
      "num_bedrooms": 4,
      "num_bathrooms": 2,
      "living_area_sqft": 2200,
      "contacts": [
        {
          "dm_person_id": "per_67890",
          "full_name": "John Smith",
          "first_name": "John",
          "last_name": "Smith",
          "is_likely_owner": true,
          "is_in_owner_family": false,
          "is_resident": true,
          "is_likely_renter": false,
          "phones": [
            { "number": "5125551234", "type": "wireless", "do_not_call": false }
          ],
          "emails": [
            { "address": "john.smith@example.com" }
          ]
        }
      ]
    }
  ],
  "totals": {
    "properties": 1847,
    "people": 2134
  },
  "credits": {
    "used": 26,
    "properties": 25,
    "people": 1,
    "deduplicated": 0
  },
  "pagination": {
    "page": 1,
    "per_page": 25,
    "total_results": 1847,
    "total_pages": 74,
    "has_next_page": true,
    "has_previous_page": false
  }
}

Response

Every search response contains three top-level keys: data, totals, and pagination.

data

An array of result objects. The shape depends on the anchor parameter. Each property includes base fields (address, coordinates, images, bedrooms, bathrooms, sqft) plus any requested fields, and contacts include phones, emails, and DNC status. Credits are consumed per entity. When anchor is "properties" (the default), each object is a property. Every property includes the always-included fields — address, coordinates, and signed image URLs — plus any fields you requested and, optionally, a contacts array.
{
  "dm_property_id": "prop_a1b2c3",
  "full_address": "1200 Barton Springs Rd, Austin, TX 78704",
  "address": "1200 Barton Springs Rd",
  "unit": null,
  "city": "Austin",
  "state": "TX",
  "zip": "78704",
  "latitude": 30.2598,
  "longitude": -97.7544,
  "images": {
    "street_view": "https://next.v3.dealmachine.com/map/streetview?...",
    "satellite": "https://next.v3.dealmachine.com/map/satellite?...",
    "roadmap": "https://next.v3.dealmachine.com/map/staticmap?..."
  },
  "estimated_value": 575000,
  "equity_percent": 72,
  "num_bedrooms": 4,
  "num_bathrooms": 2,
  "living_area_sqft": 2200,
  "contacts": [
    {
      "dm_person_id": "per_67890",
      "full_name": "John Smith",
      "first_name": "John",
      "last_name": "Smith",
      "is_likely_owner": true,
      "is_in_owner_family": false,
      "is_resident": true,
      "is_likely_renter": false,
      "phones": [
        { "number": "5125551234", "type": "wireless", "do_not_call": false }
      ],
      "emails": [
        { "address": "john.smith@example.com" }
      ]
    }
  ]
}
When anchor is "people", each object is a person. The person’s residence (where they live) is in a residence object, and the associated property is nested in a property object. See Anchor Behavior for details.
{
  "dm_person_id": "per_150468071288",
  "full_name": "Craig Heller",
  "first_name": "Craig",
  "last_name": "Heller",
  "phones": [
    { "number": "5125551234", "type": "wireless", "do_not_call": true },
    { "number": "5125559876", "type": "landline", "do_not_call": false }
  ],
  "emails": [
    { "address": "craig@example.com" }
  ],
  "residence": {
    "address": "315 N 11TH ST",
    "unit": "APT 1203",
    "city": "SAINT LOUIS",
    "state": "MO",
    "zip": "63101",
    "full_address": "315 N 11TH ST APT 1203, SAINT LOUIS, MO 63101"
  },
  "property": {
    "dm_property_id": "prop_80365658",
    "full_address": "316 N 8TH ST, SAINT LOUIS, MO 63101",
    "address": "316 N 8TH ST",
    "unit": null,
    "city": "SAINT LOUIS",
    "state": "MO",
    "zip": "63101",
    "latitude": 38.63026,
    "longitude": -90.193701,
    "images": { "..." },
    "estimated_value": 305000
  }
}

contacts

The contacts array is present on each property when contact_audience is set to a value other than "none" (default: "owners").
FieldTypeDescription
dm_person_idstringDealMachine person ID
full_namestringFull display name
first_namestring | nullFirst/given name
last_namestring | nullLast/family name
is_likely_ownerbooleanWhether this person is likely the owner
is_in_owner_familybooleanWhether this person is in the owner’s family
is_residentbooleanWhether this person is a resident
is_likely_renterbooleanWhether this person is likely a renter
phonesarrayPhone numbers with number, type, and do_not_call
emailsarrayEmail addresses with address

totals

The full count of matching entities across the entire result set, regardless of pagination.
{
  "totals": {
    "properties": 1847,
    "people": 2134
  }
}
FieldTypeDescription
propertiesintegerTotal properties matching the filters
peopleintegerTotal people matching the filters and contact_audience

pagination

FieldTypeDescription
pageintegerCurrent page number
per_pageintegerResults per page
total_resultsintegerTotal matching records
total_pagesintegerTotal pages available
has_next_pagebooleanWhether more pages exist after this one
has_previous_pagebooleanWhether pages exist before this one

Anchor Behavior

The anchor parameter controls the response shape and how mixed filters are applied.

anchor: "properties" (default)

Results are properties. Contacts matching the contact_audience are nested in a contacts array on each property.
  • Property filters determine which properties are returned.
  • People filters scope the contacts array on each property — they do not filter out properties. A property is still returned even if no contacts match.
  • People fields you request appear on each object in the contacts array.
  • If contact_audience is "none", no contacts array is included. Default is "owners".

anchor: "people"

Results are people. The contact_audience parameter is required.
  • Property filters determine which properties to search within.
  • People filters determine which people are returned.
  • The response is an array of people matching both the property criteria and the contact audience.
  • Each person includes a residence object (where they live — not necessarily a property they own) and a nested property object (the associated property from the search).
  • Requested fields (e.g., estimated_value) appear inside the nested property object.

Notes

  • At least one filter is required. Passing an empty filters array returns a validation error.
  • All filters are combined with AND logic. See Searching.
  • contact_audience is required when anchor is "people" and defaults to "owners" when anchor is "properties". Set to "none" to skip contacts entirely.
  • When anchor is "properties", people filters scope the contacts array but do not filter properties. A property with no matching contacts still appears with an empty contacts array.
  • All search results are enriched and consume credits per entity. Use estimate_cost: true to preview credit costs before searching.
  • Use source_type=properties and source_type=people when calling List Filters and List Fields to discover available filters and fields.

Cost Estimate

Set estimate_cost: true to preview the credit cost of a search before committing to it. The request is validated identically to a real search — same filters, same pagination — but no data is returned and no credits are consumed.
curl -X POST "https://api.v2.dealmachine.com/v1/properties/search" \
  -H "Authorization: Bearer dm_sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "estimate_cost": true,
    "locations": [
      { "type": "state", "code": "TX" }
    ],
    "anchor": "properties",
    "contact_audience": "owners",
    "filters": [
      { "filter_id": "estimated_value", "operator": "range", "value": { "min": 200000, "max": 600000 } }
    ],
    "page": 1,
    "per_page": 25
  }'
The response contains totals, pagination, and estimated_credits — but no data array:
{
  "totals": {
    "properties": 1847,
    "people": 2134
  },
  "pagination": {
    "page": 1,
    "per_page": 25,
    "total_results": 1847,
    "total_pages": 74,
    "has_next_page": true,
    "has_previous_page": false
  },
  "estimated_credits": {
    "this_page": 56,
    "total_all_pages": 3981,
    "breakdown": {
      "properties": 25,
      "people": 31,
      "already_accessed": 8,
      "note": "8 entities on this page were already accessed this billing period (no charge)"
    }
  }
}
FieldTypeDescription
estimated_credits.this_pageintegerCredits this page would consume (new entities only)
estimated_credits.total_all_pagesintegerCredits all pages combined would consume
estimated_credits.breakdown.propertiesintegerNew property credits on this page
estimated_credits.breakdown.peopleintegerNew contact credits on this page
estimated_credits.breakdown.already_accessedintegerEntities already accessed this billing period (free)
Cost estimate is free and does not consume credits. Use it as often as needed. To get just the total count without cost estimates, use Count Properties.