Skip to main content
POST
/
v1
/
people
/
search
curl -X POST "https://api.v2.dealmachine.com/v1/people/search" \
  -H "Authorization: Bearer dm_sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "locations": [
      { "type": "state", "code": "TX" }
    ],
    "property_match": "owner",
    "filters": [
      {
        "filter_id": "estimated_value",
        "operator": "greater_than",
        "value": 500000
      },
      {
        "filter_id": "has_phone",
        "value": true
      }
    ],
    "fields": [
      "full_name",
      "phones",
      "emails",
      "estimated_value",
      "equity_percent"
    ],
    "page": 1,
    "per_page": 25,
    "sort": [
      { "field_id": "full_name", "direction": "asc" }
    ]
  }'
{
  "data": [
    {
      "dm_person_id": "per_x1y2z3",
      "full_name": "John Smith",
      "first_name": "John",
      "last_name": "Smith",
      "phones": [{ "number": "5125551234", "type": "wireless", "do_not_call": false }],
      "emails": [{ "address": "john.smith@example.com" }],
      "address": "456 Oak Lane",
      "city": "Austin",
      "state": "TX",
      "zip": "78701",
      "full_address": "456 Oak Lane, Austin, TX 78701",
      "properties": [
        {
          "dm_property_id": "prop_a1b2c3",
          "full_address": "1200 Barton Springs Rd, Austin, TX 78704",
          "address": "1200 Barton Springs Rd",
          "city": "Austin",
          "state": "TX",
          "zip": "78704",
          "estimated_value": 875000,
          "equity_percent": 72
        }
      ]
    }
  ],
  "totals": {
    "people": 412,
    "properties": 387
  },
  "credits": {
    "used": 25,
    "properties": 0,
    "people": 25,
    "deduplicated": 0
  },
  "pagination": {
    "page": 1,
    "per_page": 25,
    "total_results": 412,
    "total_pages": 17,
    "has_next_page": true,
    "has_previous_page": false
  }
}
Search the DealMachine people/contacts database using filters. Control which fields are returned, how results are paginated and sorted, and optionally include property filters to find people connected to specific types of properties. When property filters are included, set property_match to define the person-to-property relationship. Matching properties are nested in a properties array on each person.

Body Parameters

locations
array
Array of location objects defining where to search. Required unless filters or protocol filters are provided (max 15). Locations use OR logic — results matching any location are included.
filters
array
Array of filter objects. Required unless locations or protocol filters are provided. You can mix people filters (source_type=people) and property filters (source_type=properties).
include_lists
object
Restrict results to people list IDs, for example { "people_list_ids": [123] }.
exclude_lists
object
Exclude people list IDs, for example { "people_list_ids": [456] }.
exclude_previously_exported
boolean | object
Exclude people already exported by your organization. Pass true for defaults or a full Query Builder export exclusion object.
bigquery_data_environment
integer
Query Builder dataset environment: 1 production, 2 staging, 3 development.
fields
string[]
Field IDs to include in results. Can include both people and property fields. Omit or pass an empty array for the default set. Property fields appear in the nested properties array when property_match is set.
property_match
string
Required when property filters are present. Defines the person-to-property relationship. Ignored when only people filters are used.Options: owner, resident, renter
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/people/search" \
  -H "Authorization: Bearer dm_sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "locations": [
      { "type": "state", "code": "TX" }
    ],
    "property_match": "owner",
    "filters": [
      {
        "filter_id": "estimated_value",
        "operator": "greater_than",
        "value": 500000
      },
      {
        "filter_id": "has_phone",
        "value": true
      }
    ],
    "fields": [
      "full_name",
      "phones",
      "emails",
      "estimated_value",
      "equity_percent"
    ],
    "page": 1,
    "per_page": 25,
    "sort": [
      { "field_id": "full_name", "direction": "asc" }
    ]
  }'
{
  "data": [
    {
      "dm_person_id": "per_x1y2z3",
      "full_name": "John Smith",
      "first_name": "John",
      "last_name": "Smith",
      "phones": [{ "number": "5125551234", "type": "wireless", "do_not_call": false }],
      "emails": [{ "address": "john.smith@example.com" }],
      "address": "456 Oak Lane",
      "city": "Austin",
      "state": "TX",
      "zip": "78701",
      "full_address": "456 Oak Lane, Austin, TX 78701",
      "properties": [
        {
          "dm_property_id": "prop_a1b2c3",
          "full_address": "1200 Barton Springs Rd, Austin, TX 78704",
          "address": "1200 Barton Springs Rd",
          "city": "Austin",
          "state": "TX",
          "zip": "78704",
          "estimated_value": 875000,
          "equity_percent": 72
        }
      ]
    }
  ],
  "totals": {
    "people": 412,
    "properties": 387
  },
  "credits": {
    "used": 25,
    "properties": 0,
    "people": 25,
    "deduplicated": 0
  },
  "pagination": {
    "page": 1,
    "per_page": 25,
    "total_results": 412,
    "total_pages": 17,
    "has_next_page": true,
    "has_previous_page": false
  }
}

Response

Every search response contains four top-level keys: data, totals, credits, and pagination. See Credits for full details on how credits work.

data

An array of person objects. Each person includes the always-included people fields — name, phones, emails, and primary address — plus any fields you requested. Credits are consumed per entity. When property_match is set and property filters are present, each person also includes a properties array with matching properties.
{
  "dm_person_id": "per_x1y2z3",
  "full_name": "John Smith",
  "first_name": "John",
  "last_name": "Smith",
  "middle_initial": null,
  "suffix": null,
  "phones": [
    { "number": "5125551234", "type": "wireless", "do_not_call": false },
    { "number": "5125559999", "type": "landline", "do_not_call": false }
  ],
  "emails": [{ "address": "john.smith@example.com" }],
  "address": "456 Oak Lane",
  "city": "Austin",
  "state": "TX",
  "zip": "78701",
  "full_address": "456 Oak Lane, Austin, TX 78701",
  "properties": [
    {
      "dm_property_id": "prop_a1b2c3",
      "full_address": "1200 Barton Springs Rd, Austin, TX 78704",
      "address": "1200 Barton Springs Rd",
      "city": "Austin",
      "state": "TX",
      "zip": "78704",
      "latitude": 30.2598,
      "longitude": -97.7544,
      "images": {
        "street_view": "https://img.dealmachine.com/sv/30.2598,-97.7544.jpg",
        "satellite": "https://img.dealmachine.com/sat/30.2598,-97.7544.jpg",
        "roadmap": "https://img.dealmachine.com/map/30.2598,-97.7544.jpg"
      },
      "estimated_value": 875000,
      "equity_percent": 72
    }
  ]
}
When no property filters are present, property_match is not needed and no properties array is included.

properties

The nested properties array on each person when property_match is set. Each property includes the always-included property fields plus any property fields you requested.
FieldTypeDescription
dm_property_idstringDealMachine internal property ID
full_addressstringComplete formatted address
addressstringStreet address line
citystringCity
statestringState abbreviation
zipstringZIP code
latitudenumberProperty latitude
longitudenumberProperty longitude
imagesobjectSigned URLs for street_view, satellite, and roadmap

totals

The full count of matching entities across the entire result set, regardless of pagination.
{
  "totals": {
    "people": 412,
    "properties": 387
  }
}
FieldTypeDescription
peopleintegerTotal people matching the filters
propertiesintegerTotal properties connected via property_match. 0 when no property filters are used.

credits

A breakdown of what this request cost. Included on every search response.
{
  "credits": {
    "used": 25,
    "properties": 0,
    "people": 25,
    "deduplicated": 0
  }
}
FieldTypeDescription
usedintegerNew credits charged after deduplication
propertiesintegerProperty lead records evaluated in this response
peopleintegerPeople lead records evaluated in this response
deduplicatedintegerEntities already accessed this billing period (free)
Credits are deduplicated within your billing period. If you’ve already accessed a person or property this month, it won’t be charged again — it shows up in deduplicated instead.

pagination

FieldTypeDescription
pageintegerCurrent page number
per_pageintegerResults per page
total_resultsintegerTotal matching records (always equals totals.people)
total_pagesintegerTotal pages available
has_next_pagebooleanWhether more pages exist after this one
has_previous_pagebooleanWhether pages exist before this one

How Property Filters Work

When you include property filters in a people search:
  1. The API finds properties matching the property filters.
  2. It looks up people connected to those properties via the property_match relationship.
  3. It applies any people filters to narrow down the results.
  4. Matching properties are nested in a properties array on each person.
Property fields you request appear on each object in the properties array. Some base property fields (dm_property_id, address, city, state, zip) are always included. If no property filters are present, property_match is not needed and no properties array is included in the response.

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.
  • property_match is required when any property filter is present, and ignored when only people filters are used.
  • When property_match is set, matching properties appear in a nested properties array on each person. Any property fields you request show up there.
  • All search results are enriched and consume credits per entity. Use estimate_cost: true to preview credit costs before searching.
  • Use source_type=people and source_type=properties 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/people/search" \
  -H "Authorization: Bearer dm_sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "estimate_cost": true,
    "locations": [
      { "type": "state", "code": "TX" }
    ],
    "property_match": "owner",
    "filters": [
      { "filter_id": "estimated_value", "operator": "greater_than", "value": 500000 }
    ],
    "page": 1,
    "per_page": 25
  }'
The response contains totals, pagination, and estimated_credits — but no data array:
{
  "totals": {
    "people": 412,
    "properties": 387
  },
  "pagination": {
    "page": 1,
    "per_page": 25,
    "total_results": 412,
    "total_pages": 17,
    "has_next_page": true,
    "has_previous_page": false
  },
  "estimated_credits": {
    "this_page": 47,
    "total_all_pages": 799,
    "breakdown": {
      "people": 25,
      "properties": 22,
      "already_accessed": 6,
      "note": "6 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.peopleintegerPeople enrichment credits on this page
estimated_credits.breakdown.propertiesintegerProperty enrichment credits on this page (only when property_match is set)
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 People.