curl -X POST "https://api.v2.dealmachine.com/v1/enrichment/phone" \
-H "Authorization: Bearer dm_sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": [
{ "phone": "5125551234" },
{ "phone": "2145559876" }
],
"fields": ["full_name", "phones", "emails", "estimated_value"],
"include_properties": true
}'
const response = await fetch('https://api.v2.dealmachine.com/v1/enrichment/phone', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
data: [{ phone: '5125551234' }, { phone: '2145559876' }],
fields: ['full_name', 'phones', 'emails', 'estimated_value'],
include_properties: true,
}),
});
const { data, totals } = await response.json();
console.log(`Matched ${totals.matched} of ${totals.submitted}`);
for (const item of data) {
if (item.matched) {
for (const contact of item.contacts) {
console.log(`${item.input.phone} → ${contact.full_name}`);
for (const prop of contact.properties ?? []) {
console.log(` Property: ${prop.address}`);
}
}
} else {
console.log(`No match: ${item.input.phone}`);
}
}
import requests
response = requests.post(
"https://api.v2.dealmachine.com/v1/enrichment/phone",
headers={"Authorization": f"Bearer {api_key}"},
json={
"data": [
{"phone": "5125551234"},
{"phone": "2145559876"},
],
"fields": ["full_name", "phones", "emails", "estimated_value"],
"include_properties": True,
},
)
body = response.json()
for item in body["data"]:
if item["matched"]:
for contact in item["contacts"]:
print(f"{item['input']['phone']} → {contact['full_name']}")
for prop in contact.get("properties", []):
print(f" Property: {prop['address']}")
else:
print(f"No match: {item['input']['phone']}")
{
"data": [
{
"input": {
"phone": "5125551234"
},
"matched": true,
"contacts": [
{
"dm_person_id": "per_x1y2z3",
"full_name": "John Smith",
"first_name": "John",
"last_name": "Smith",
"phones": [
{ "number": "5125551234", "type": "wireless", "do_not_call": false },
{ "number": "5125559999", "type": "wireless", "do_not_call": false }
],
"emails": [{ "address": "john.smith@example.com" }],
"property_count": 1,
"properties": [
{
"dm_property_id": "prop_a1b2c3",
"address": "1200 Barton Springs Rd",
"city": "Austin",
"state": "TX",
"zip": "78704",
"latitude": 30.2598,
"longitude": -97.7544
}
]
},
{
"dm_person_id": "per_a4b5c6",
"full_name": "Jane Smith",
"first_name": "Jane",
"last_name": "Smith",
"phones": [{ "number": "5125551234", "type": "wireless", "do_not_call": false }],
"emails": [{ "address": "jane.smith@example.com" }],
"property_count": 0
}
]
},
{
"input": {
"phone": "2145559876"
},
"matched": false,
"match_failure": {
"code": "not_found",
"reason": "No person found matching the provided phone number"
}
}
],
"totals": {
"submitted": 2,
"matched": 1,
"unmatched": 1
},
"credits": {
"used": 3,
"properties": 1,
"people": 2,
"deduplicated": 0
}
}
{
"error": {
"code": "validation_error",
"message": "Validation failed",
"request_id": "req_abc123def456",
"details": {
"issues": [
{
"path": "data[0].phone",
"message": "phone must be a valid 10-digit US phone number"
}
]
}
}
}
{
"error": {
"code": "invalid_api_key",
"message": "The provided API key is invalid",
"request_id": "req_def456ghi789"
}
}
{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests. Please retry after the specified time.",
"request_id": "req_ghi789jkl012"
}
}
Enrichment
Enrich by Phone
POST
/
v1
/
enrichment
/
phone
curl -X POST "https://api.v2.dealmachine.com/v1/enrichment/phone" \
-H "Authorization: Bearer dm_sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": [
{ "phone": "5125551234" },
{ "phone": "2145559876" }
],
"fields": ["full_name", "phones", "emails", "estimated_value"],
"include_properties": true
}'
const response = await fetch('https://api.v2.dealmachine.com/v1/enrichment/phone', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
data: [{ phone: '5125551234' }, { phone: '2145559876' }],
fields: ['full_name', 'phones', 'emails', 'estimated_value'],
include_properties: true,
}),
});
const { data, totals } = await response.json();
console.log(`Matched ${totals.matched} of ${totals.submitted}`);
for (const item of data) {
if (item.matched) {
for (const contact of item.contacts) {
console.log(`${item.input.phone} → ${contact.full_name}`);
for (const prop of contact.properties ?? []) {
console.log(` Property: ${prop.address}`);
}
}
} else {
console.log(`No match: ${item.input.phone}`);
}
}
import requests
response = requests.post(
"https://api.v2.dealmachine.com/v1/enrichment/phone",
headers={"Authorization": f"Bearer {api_key}"},
json={
"data": [
{"phone": "5125551234"},
{"phone": "2145559876"},
],
"fields": ["full_name", "phones", "emails", "estimated_value"],
"include_properties": True,
},
)
body = response.json()
for item in body["data"]:
if item["matched"]:
for contact in item["contacts"]:
print(f"{item['input']['phone']} → {contact['full_name']}")
for prop in contact.get("properties", []):
print(f" Property: {prop['address']}")
else:
print(f"No match: {item['input']['phone']}")
{
"data": [
{
"input": {
"phone": "5125551234"
},
"matched": true,
"contacts": [
{
"dm_person_id": "per_x1y2z3",
"full_name": "John Smith",
"first_name": "John",
"last_name": "Smith",
"phones": [
{ "number": "5125551234", "type": "wireless", "do_not_call": false },
{ "number": "5125559999", "type": "wireless", "do_not_call": false }
],
"emails": [{ "address": "john.smith@example.com" }],
"property_count": 1,
"properties": [
{
"dm_property_id": "prop_a1b2c3",
"address": "1200 Barton Springs Rd",
"city": "Austin",
"state": "TX",
"zip": "78704",
"latitude": 30.2598,
"longitude": -97.7544
}
]
},
{
"dm_person_id": "per_a4b5c6",
"full_name": "Jane Smith",
"first_name": "Jane",
"last_name": "Smith",
"phones": [{ "number": "5125551234", "type": "wireless", "do_not_call": false }],
"emails": [{ "address": "jane.smith@example.com" }],
"property_count": 0
}
]
},
{
"input": {
"phone": "2145559876"
},
"matched": false,
"match_failure": {
"code": "not_found",
"reason": "No person found matching the provided phone number"
}
}
],
"totals": {
"submitted": 2,
"matched": 1,
"unmatched": 1
},
"credits": {
"used": 3,
"properties": 1,
"people": 2,
"deduplicated": 0
}
}
{
"error": {
"code": "validation_error",
"message": "Validation failed",
"request_id": "req_abc123def456",
"details": {
"issues": [
{
"path": "data[0].phone",
"message": "phone must be a valid 10-digit US phone number"
}
]
}
}
}
{
"error": {
"code": "invalid_api_key",
"message": "The provided API key is invalid",
"request_id": "req_def456ghi789"
}
}
{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests. Please retry after the specified time.",
"request_id": "req_ghi789jkl012"
}
}
Look up people by phone number. Each item in the
data array provides a phone number, and the API returns all people associated with that number in a contacts array.
Each request accepts up to 250 items in the
data array. The response returns every submitted
item with a matched flag indicating whether a person was found.Body Parameters
array
required
Array of phone objects to look up (max 250).
Show Phone object properties
Show Phone object properties
string
required
Phone number (10-digit US number, e.g.,
"5125551234"). The API normalizes common formats — dashes, spaces, parentheses, and the +1 country code are all accepted.string[]
Field IDs to include in results. Can include both people and property fields.
Omit or pass an empty array for the default set.
boolean
default:false
When
true, each matched person includes a properties array with all associated properties and
their always-included fields.curl -X POST "https://api.v2.dealmachine.com/v1/enrichment/phone" \
-H "Authorization: Bearer dm_sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": [
{ "phone": "5125551234" },
{ "phone": "2145559876" }
],
"fields": ["full_name", "phones", "emails", "estimated_value"],
"include_properties": true
}'
const response = await fetch('https://api.v2.dealmachine.com/v1/enrichment/phone', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
data: [{ phone: '5125551234' }, { phone: '2145559876' }],
fields: ['full_name', 'phones', 'emails', 'estimated_value'],
include_properties: true,
}),
});
const { data, totals } = await response.json();
console.log(`Matched ${totals.matched} of ${totals.submitted}`);
for (const item of data) {
if (item.matched) {
for (const contact of item.contacts) {
console.log(`${item.input.phone} → ${contact.full_name}`);
for (const prop of contact.properties ?? []) {
console.log(` Property: ${prop.address}`);
}
}
} else {
console.log(`No match: ${item.input.phone}`);
}
}
import requests
response = requests.post(
"https://api.v2.dealmachine.com/v1/enrichment/phone",
headers={"Authorization": f"Bearer {api_key}"},
json={
"data": [
{"phone": "5125551234"},
{"phone": "2145559876"},
],
"fields": ["full_name", "phones", "emails", "estimated_value"],
"include_properties": True,
},
)
body = response.json()
for item in body["data"]:
if item["matched"]:
for contact in item["contacts"]:
print(f"{item['input']['phone']} → {contact['full_name']}")
for prop in contact.get("properties", []):
print(f" Property: {prop['address']}")
else:
print(f"No match: {item['input']['phone']}")
{
"data": [
{
"input": {
"phone": "5125551234"
},
"matched": true,
"contacts": [
{
"dm_person_id": "per_x1y2z3",
"full_name": "John Smith",
"first_name": "John",
"last_name": "Smith",
"phones": [
{ "number": "5125551234", "type": "wireless", "do_not_call": false },
{ "number": "5125559999", "type": "wireless", "do_not_call": false }
],
"emails": [{ "address": "john.smith@example.com" }],
"property_count": 1,
"properties": [
{
"dm_property_id": "prop_a1b2c3",
"address": "1200 Barton Springs Rd",
"city": "Austin",
"state": "TX",
"zip": "78704",
"latitude": 30.2598,
"longitude": -97.7544
}
]
},
{
"dm_person_id": "per_a4b5c6",
"full_name": "Jane Smith",
"first_name": "Jane",
"last_name": "Smith",
"phones": [{ "number": "5125551234", "type": "wireless", "do_not_call": false }],
"emails": [{ "address": "jane.smith@example.com" }],
"property_count": 0
}
]
},
{
"input": {
"phone": "2145559876"
},
"matched": false,
"match_failure": {
"code": "not_found",
"reason": "No person found matching the provided phone number"
}
}
],
"totals": {
"submitted": 2,
"matched": 1,
"unmatched": 1
},
"credits": {
"used": 3,
"properties": 1,
"people": 2,
"deduplicated": 0
}
}
{
"error": {
"code": "validation_error",
"message": "Validation failed",
"request_id": "req_abc123def456",
"details": {
"issues": [
{
"path": "data[0].phone",
"message": "phone must be a valid 10-digit US phone number"
}
]
}
}
}
{
"error": {
"code": "invalid_api_key",
"message": "The provided API key is invalid",
"request_id": "req_def456ghi789"
}
}
{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests. Please retry after the specified time.",
"request_id": "req_ghi789jkl012"
}
}
Response Fields
The response contains adata array and a totals object. There is no pagination — all submitted items are returned in a single response.
Matched Result
Whenmatched is true, the result contains a contacts array with every person matching the phone number.
| Field | Type | Description |
|---|---|---|
input | object | Echo of the original input object |
matched | boolean | true |
contacts | array | All people matching the phone number (see below) |
Contact Object
Each object in thecontacts array contains:
| Field | Type | Description |
|---|---|---|
dm_person_id | string | DealMachine internal person ID |
full_name | string | Full display name |
first_name, last_name | string | null | Parsed name components |
property_count | integer | Number of associated properties. This count is free metadata. |
property | object | Property context and requested property fields when fields includes property data. |
phones | array | Phone numbers with number, normalized type, and do_not_call |
emails | array | Email addresses |
properties | array | Associated properties. Only present when include_properties is true. |
| requested fields | varies | Any fields specified in fields |
Unmatched Result
| Field | Type | Description |
|---|---|---|
input | object | Echo of the original input object |
matched | boolean | false |
match_failure | object | Structured failure with code and reason |
match_failure.code | string | Machine-readable failure code (see Match Failure Codes below) |
match_failure.reason | string | Human-readable explanation of why no match was found |
Match Failure Codes
These codes are shared across all enrichment endpoints.| Code | Description |
|---|---|
not_found | No matching record exists for the provided input |
invalid_input | The input could not be processed (e.g., invalid address, invalid email, invalid phone number). The reason field provides specifics. |
Totals
| Field | Type | Description |
|---|---|---|
submitted | integer | Number of items in the request data array |
matched | integer | Number of items that matched a person |
unmatched | integer | Number of items that did not match |
Credits
This endpoint consumes 1 people credit per matched person. Theproperty_count field is free. When include_properties is true, included properties consume property credits. Chargeable property fields requested through fields add property credits. Only matched results consume credits. Credits are deduplicated within your billing period, so accessing the same entity again is free.
Every response includes a credits object with a full breakdown of what was charged. See Credits for details.
Notes
- A single phone number may match multiple people. All matching contacts are returned in the
contactsarray. - Phone numbers are normalized to 10 digits. Formatting like
(512) 555-1234,512-555-1234,+1 512 555 1234are all accepted and matched against the same canonical number. - When
include_propertiesistrue, each contact’spropertiesarray includes all associated properties. - Items are matched independently — one failed match does not affect others.
- The
inputobject is always echoed back so you can correlate results with your input data.
⌘I