API: Single Skip Trace
Look up one owner synchronously with POST /trace and get contact data back inline.
POST /trace is the synchronous version of skip tracing: send one owner and property, and the response comes back with phones and emails inline — no polling, no result files. It is the right tool for real-time flows like enriching a single inbound lead the moment it hits your CRM. For lists, use bulk jobs instead. If you prefer clicking to coding, the same lookup exists in the dashboard — see the single skip trace guide.
Request fields
The body is a single flat JSON object. address, city, and state are required; everything else improves match quality. Unknown fields are rejected with 422 validation_error.
| Field | Required | Description |
|---|---|---|
first_name | No | Owner first name. Leave empty for companies. |
last_name | No | Owner last name — or the full company/LLC name (entity pricing applies automatically). |
address | Yes | Property street address. |
city | Yes | Property city. |
state | Yes | Property state (2-letter). |
zip | No | Property ZIP — improves match rate. |
mailing_address / mailing_city / mailing_state / mailing_zip | No | Owner mailing address, if different from the property. |
county / apn | No | Extra match hints. |
owner_type | No | Owner classification from your data source, e.g. "Individual", "Company", "Trust", "Investor". |
Tracing an individual
curl -X POST https://data.acquiredcrm.com/api/v1/trace \
-H "Authorization: Bearer ad_live_XXXX" \
-H "Content-Type: application/json" \
-d '{
"first_name": "John",
"last_name": "Doe",
"address": "123 Main St",
"city": "Phoenix",
"state": "AZ",
"zip": "85001"
}'{
"job_id": "8f3b83b4-2c1e-4f0a-9d7b-6a1e2c3d4e5f",
"status": "completed",
"matched": true,
"cached": false,
"credits_charged": 2,
"environment": "production",
"result": {
"property_address": "123 Main St",
"property_city": "Phoenix",
"matched_first_name": "John",
"matched_last_name": "Doe",
"primary_phone": "6025551234",
"primary_phone_type": "Mobile",
"mobile_phone_1": "6025551234",
"mobile_phone_2": "",
"mobile_phone_3": "",
"landline_phone_1": "",
"email_1": "john@example.com",
"email_2": ""
}
}Every result field is a flat string keyed like primary_phone or email_1, so you can map fields directly into GoHighLevel or any workflow tool without transformation. matched tells you whether the lookup found the owner, and cached is true when a recent trace of the same owner was served from cache within the freshness window — repeat lookups return at full speed.
Tracing an LLC or trust
For company-owned properties, put the full entity name in last_name and leave first_name empty. Entity detection is automatic (an explicit owner_type like "Company" or "Trust" helps), and the trace bills at your llc_trust_trace rate instead of single_trace because the platform first pierces the entity to find the person behind it.
curl -X POST https://data.acquiredcrm.com/api/v1/trace \
-H "Authorization: Bearer ad_live_XXXX" \
-H "Content-Type: application/json" \
-d '{
"last_name": "Sunrise Holdings LLC",
"address": "456 Oak Ave",
"city": "Portland",
"state": "OR",
"owner_type": "Company"
}'Pricing and errors
Single traces bill at your single_trace rate (default 2 credits) — higher than the per-row base_trace rate bulk jobs use, in exchange for the synchronous inline response. LLC/Trust owners bill at llc_trust_trace (default 6 credits). Check GET /pricing for your account rates. Watch for these errors:
402 insufficient_credits— balance below the trace cost.422 validation_error— missingaddress/city/stateor unknown fields.429 job_in_progress— a bulk job is currently running on your account; retry afterRetry-After.
When to use bulk jobs instead
If you have more than a handful of records, bulk jobs are cheaper per row (the base_trace rate), accept up to 10,000 rows per request as JSON or a raw CSV upload, and notify you via signed webhooks when they finish.