APIUpdated 2026-07-17

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.

FieldRequiredDescription
first_nameNoOwner first name. Leave empty for companies.
last_nameNoOwner last name — or the full company/LLC name (entity pricing applies automatically).
addressYesProperty street address.
cityYesProperty city.
stateYesProperty state (2-letter).
zipNoProperty ZIP — improves match rate.
mailing_address / mailing_city / mailing_state / mailing_zipNoOwner mailing address, if different from the property.
county / apnNoExtra match hints.
owner_typeNoOwner classification from your data source, e.g. "Individual", "Company", "Trust", "Investor".

Tracing an individual

Request
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"
  }'
Response
{
  "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.

Request (LLC owner)
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 — missing address/city/state or unknown fields.
  • 429 job_in_progress — a bulk job is currently running on your account; retry after Retry-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.