curl -X POST "https://api.v2.dealmachine.com/v1/enrichment/email" \
-H "Authorization: Bearer dm_sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": [
{ "email": "john.smith@example.com" },
{ "email": "sarah.johnson@example.com" }
],
"fields": ["full_name", "phones", "emails", "estimated_value"],
"include_properties": true
}'
const response = await fetch('https://api.v2.dealmachine.com/v1/enrichment/email', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
data: [{ email: 'john.smith@example.com' }, { email: 'sarah.johnson@example.com' }],
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.email} → ${contact.full_name} — ${contact.phones?.[0]?.number}`);
for (const prop of contact.properties ?? []) {
console.log(` Property: ${prop.address}`);
}
}
} else {
console.log(`No match: ${item.input.email}`);
}
}
import requests
response = requests.post(
"https://api.v2.dealmachine.com/v1/enrichment/email",
headers={"Authorization": f"Bearer {api_key}"},
json={
"data": [
{"email": "john.smith@example.com"},
{"email": "sarah.johnson@example.com"},
],
"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']['email']} → {contact['full_name']}")
for prop in contact.get("properties", []):
print(f" Property: {prop['address']}")
else:
print(f"No match: {item['input']['email']}")
{
"data": [
{
"input": {
"email": "john.smith@example.com"
},
"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
}
]
}
]
},
{
"input": {
"email": "sarah.johnson@example.com"
},
"matched": false,
"match_failure": {
"code": "not_found",
"reason": "No person found matching the provided email address"
}
}
],
"totals": {
"submitted": 2,
"matched": 1,
"unmatched": 1
},
"credits": {
"used": 2,
"properties": 1,
"people": 1,
"deduplicated": 0
}
}
{
"error": {
"code": "validation_error",
"message": "Validation failed",
"request_id": "req_abc123def456",
"details": {
"issues": [
{
"path": "data[0].email",
"message": "email must be a valid email address"
}
]
}
}
}
{
"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 Email
POST
/
v1
/
enrichment
/
email
curl -X POST "https://api.v2.dealmachine.com/v1/enrichment/email" \
-H "Authorization: Bearer dm_sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": [
{ "email": "john.smith@example.com" },
{ "email": "sarah.johnson@example.com" }
],
"fields": ["full_name", "phones", "emails", "estimated_value"],
"include_properties": true
}'
const response = await fetch('https://api.v2.dealmachine.com/v1/enrichment/email', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
data: [{ email: 'john.smith@example.com' }, { email: 'sarah.johnson@example.com' }],
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.email} → ${contact.full_name} — ${contact.phones?.[0]?.number}`);
for (const prop of contact.properties ?? []) {
console.log(` Property: ${prop.address}`);
}
}
} else {
console.log(`No match: ${item.input.email}`);
}
}
import requests
response = requests.post(
"https://api.v2.dealmachine.com/v1/enrichment/email",
headers={"Authorization": f"Bearer {api_key}"},
json={
"data": [
{"email": "john.smith@example.com"},
{"email": "sarah.johnson@example.com"},
],
"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']['email']} → {contact['full_name']}")
for prop in contact.get("properties", []):
print(f" Property: {prop['address']}")
else:
print(f"No match: {item['input']['email']}")
{
"data": [
{
"input": {
"email": "john.smith@example.com"
},
"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
}
]
}
]
},
{
"input": {
"email": "sarah.johnson@example.com"
},
"matched": false,
"match_failure": {
"code": "not_found",
"reason": "No person found matching the provided email address"
}
}
],
"totals": {
"submitted": 2,
"matched": 1,
"unmatched": 1
},
"credits": {
"used": 2,
"properties": 1,
"people": 1,
"deduplicated": 0
}
}
{
"error": {
"code": "validation_error",
"message": "Validation failed",
"request_id": "req_abc123def456",
"details": {
"issues": [
{
"path": "data[0].email",
"message": "email must be a valid email address"
}
]
}
}
}
{
"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 email address. Each item in the
data array provides an email, and the API returns all people associated with that address 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 email objects to look up (max 250).
Show Email object properties
Show Email object properties
string
required
Email address to look up (e.g.,
"john.smith@example.com").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/email" \
-H "Authorization: Bearer dm_sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": [
{ "email": "john.smith@example.com" },
{ "email": "sarah.johnson@example.com" }
],
"fields": ["full_name", "phones", "emails", "estimated_value"],
"include_properties": true
}'
const response = await fetch('https://api.v2.dealmachine.com/v1/enrichment/email', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
data: [{ email: 'john.smith@example.com' }, { email: 'sarah.johnson@example.com' }],
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.email} → ${contact.full_name} — ${contact.phones?.[0]?.number}`);
for (const prop of contact.properties ?? []) {
console.log(` Property: ${prop.address}`);
}
}
} else {
console.log(`No match: ${item.input.email}`);
}
}
import requests
response = requests.post(
"https://api.v2.dealmachine.com/v1/enrichment/email",
headers={"Authorization": f"Bearer {api_key}"},
json={
"data": [
{"email": "john.smith@example.com"},
{"email": "sarah.johnson@example.com"},
],
"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']['email']} → {contact['full_name']}")
for prop in contact.get("properties", []):
print(f" Property: {prop['address']}")
else:
print(f"No match: {item['input']['email']}")
{
"data": [
{
"input": {
"email": "john.smith@example.com"
},
"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
}
]
}
]
},
{
"input": {
"email": "sarah.johnson@example.com"
},
"matched": false,
"match_failure": {
"code": "not_found",
"reason": "No person found matching the provided email address"
}
}
],
"totals": {
"submitted": 2,
"matched": 1,
"unmatched": 1
},
"credits": {
"used": 2,
"properties": 1,
"people": 1,
"deduplicated": 0
}
}
{
"error": {
"code": "validation_error",
"message": "Validation failed",
"request_id": "req_abc123def456",
"details": {
"issues": [
{
"path": "data[0].email",
"message": "email must be a valid email address"
}
]
}
}
}
{
"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 email address.
| Field | Type | Description |
|---|---|---|
input | object | Echo of the original input object |
matched | boolean | true |
contacts | array | All people matching the email address (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 email address may match multiple people. All matching contacts are returned in the
contactsarray. - Email matching is case-insensitive.
- 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