Developer Docs
Download .md file (Feed to AI for context)

Skip Tracing API Documentation

Build on Tracerfy's skip tracing platform. Secure, scalable REST API designed for high-volume property owner contact data retrieval workflows.

Base URL
https://tracerfy.com/v1/api/
Auth
Authorization: Bearer <TOKEN>
REF

Authentication, Errors & Rate Limits

Applies to every /v1/api/ endpoint
Description: Every endpoint requires a Bearer token in the Authorization header: Authorization: Bearer <YOUR_TOKEN>. Requests without a valid token get a 401.

Status codes you may receive:
  • 200 OK β€” success (synchronous endpoints).
  • 202 Accepted β€” async job accepted and queued (e.g. Lead Builder execute).
  • 400 Bad Request β€” malformed body, missing/invalid parameter, or a column named in your request is not present in the uploaded data.
  • 401 Unauthorized β€” missing, malformed, or invalid/expired Bearer token.
  • 402 Payment Required β€” insufficient credits for the requested work.
  • 403 Forbidden β€” account suspended (unpaid invoices or API access disabled), or you tried to access a resource that belongs to another account.
  • 404 Not Found β€” the resource ID does not exist (or is not yours β€” unknown and cross-account IDs both return 404 to prevent ID enumeration).
  • 405 Method Not Allowed β€” wrong HTTP method for the route.
  • 409 Conflict β€” the resource is not ready yet (e.g. reading rows of a lead list that is still processing).
  • 429 Too Many Requests β€” a rate limit was exceeded. Back off and retry; the response body includes how many requests were counted in the window.
  • 500 Internal Server Error β€” an unexpected error. Retry; if it persists, contact support.
  • 502 / 503 β€” the request couldn't be completed right away due to a temporary service delay. This usually resolves on its own. If it persists, contact support.
Rate limits (per account):
  • Batch Trace & APN Batch Trace β€” 10 submissions per 5 minutes.
  • Instant Trace, APN Instant Lookup & Lead Builder Lookup β€” 500 lookups per minute (shared counter).
  • DNC Scrub β€” 10 scrubs per 5 minutes.
  • DNC Instant Lookup β€” 30 lookups per minute.
  • Fetch all Queues β€” 1 request per 20 seconds.
  • Lead Builder Preview β€” 500 previews per hour.
  • Lead Builder Execute β€” 10 lists per hour and 50 per day.
  • Address Autocomplete β€” 30 requests per minute.
The insufficient-credits (402) and suspended-account (403) message wording varies slightly per endpoint, but the shape and status code are the same everywhere. Representative bodies are below.

Headers

  • Authorization = Bearer <YOUR_TOKEN>

401 Unauthorized β€” missing or invalid token

{
  "detail": "Authentication credentials were not provided."
}

400 Bad Request — field validation (detail is a field→messages map)

{
  "address": [
    "This field is required."
  ],
  "state": [
    "This field is required."
  ]
}

402 Payment Required β€” insufficient credits

// When the account cannot use monthly billing
{
  "error": "Insufficient credits. Instant trace requires 5 credits per lookup. You have 0 credits."
}

// When credits are short and no payment method is on file
{
  "error": "Insufficient credits. Instant trace requires 5 credits per lookup. Please add credits or a payment method."
}

403 Forbidden β€” account suspended

// Unpaid invoices
{
  "error": "Your account has been temporarily suspended due to unpaid invoices. Please contact [email protected] to resolve outstanding payments."
}

// API access disabled for this account
{
  "error": "api_disabled",
  "detail": "Your API access has been suspended. Please contact support at [email protected].",
  "status": 403
}

404 Not Found β€” unknown or cross-account resource ID

{
  "error": "No Queue Found with ID 123"
}

429 Too Many Requests β€” rate limited

// Most endpoints β€” includes the count seen in the window
{
  "status": 429,
  "error": "Rate limit exceeded. Max 500 lookups per minute.",
  "lookups_in_window": 500
}

// Fetch all Queues (20-second throttle)
{
  "error": "Rate limit exceeded. Retry in intervals of 20 seconds.",
  "retry_in": "3 seconds"
}
REF

Sandbox / Testing Environment

https://mock.tracerfy.com/v1/api/
Description: Before you spend a single credit, build and test your integration against the free hosted sandbox at https://mock.tracerfy.com. It mirrors this exact API β€” same paths, methods, field names, and response shapes β€” but returns realistic fake data. Nothing is charged and no credits are consumed.

Going live is a one-line change: develop against https://mock.tracerfy.com/v1/api/, then swap the host to https://tracerfy.com/v1/api/ and use your real token. Nothing else about your code changes.
  • Auth: any non-empty Bearer token authenticates β€” no real key needed. (The reserved value INVALID_TOKEN always returns 401 so you can test your unauthorized path.)
  • Deterministic: the same request always returns the same data (it's seeded from your inputs), so your test assertions stay stable. Only meta.request_id and meta.timestamp vary between calls.
  • Full coverage: every endpoint in these docs β€” batch & instant trace, parcel/APN, DNC, property search, saved templates, and property monitors.
  • Interactive docs: browse and try every endpoint at https://mock.tracerfy.com/docs.
Magic values β€” force a specific scenario on demand. Anything you send that isn't a magic value flows through to a normal deterministic fake response. The values below instead trigger a fixed outcome, so you can exercise every branch of your client without hunting for real data that happens to hit or miss:
  • Numeric path IDs β€” use an HTTP status code as any {id} to reproduce that scenario: 404 not found, 403 cross-account, 409 still processing, 0 a pending job. e.g. GET /v1/api/property-monitors/404/404.
  • String sentinels β€” embed a keyword in the primary string field (address, phone, a monitor name, a strategy value, or a CSV *_column): NO_CREDITS→402, SUSPENDED→403, RATE_LIMIT→429, SERVER_ERROR→500, UNAVAILABLE→503, MISSING_COLUMN→400 (CSV), NO_MATCH→200 empty, MULTI→200 multiple results, CAP_REACHED→400 (monitor cap). The literal address 999 Nowhere Blvd behaves as a miss.
The sandbox is for development only β€” it returns fabricated data, so never point production traffic at it.

Headers

  • Authorization = Bearer <ANY_NON_EMPTY_TOKEN>

Example Request

# Test against the sandbox β€” any token works, nothing is billed
curl -X POST 'https://mock.tracerfy.com/v1/api/trace/lookup/' \
  -H 'Authorization: Bearer sandbox_test_token' \
  -H 'Content-Type: application/json' \
  -d '{"address":"123 Main St","city":"Austin","state":"TX","zip":"78701"}'

# Force a scenario with a magic value (402 insufficient credits)
curl -X POST 'https://mock.tracerfy.com/v1/api/trace/lookup/' \
  -H 'Authorization: Bearer sandbox_test_token' \
  -H 'Content-Type: application/json' \
  -d '{"address":"NO_CREDITS","city":"Austin","state":"TX"}'

# Ready for real data? Change the host and use your real token
curl -X POST 'https://tracerfy.com/v1/api/trace/lookup/' \
  -H 'Authorization: Bearer ' \
  -H 'Content-Type: application/json' \
  -d '{"address":"123 Main St","city":"Austin","state":"TX","zip":"78701"}'

Example Response 200 OK

// POST /v1/api/trace/lookup/ on the sandbox β€” the exact body the first curl above
// returns. Deterministic: the same request always returns this data (only meta varies).
{
  "address": "123 Main St",
  "city": "Austin",
  "state": "TX",
  "zip": "78701",
  "find_owner": true,
  "hit": true,
  "persons_count": 1,
  "credits_deducted": 5,
  "persons": [
    {
      "first_name": "Sandra",
      "last_name": "Dean",
      "full_name": "Sandra Dean",
      "dob": "1958-12-14",
      "age": "67",
      "deceased": true,
      "property_owner": true,
      "litigator": false,
      "mailing_address": {
        "street": "469 Amy Pines Suite 707",
        "city": "Christinebury",
        "state": "CT",
        "zip": "50627"
      },
      "phones": [
        {
          "number": "5088697674",
          "type": "Mobile",
          "dnc": false,
          "tcpa": false,
          "carrier": "COMCAST PHONE LLC",
          "rank": 1
        },
        {
          "number": "6478388352",
          "type": "Landline",
          "dnc": true,
          "tcpa": false,
          "carrier": "US CELLULAR",
          "rank": 2
        }
      ],
      "emails": [
        {
          "email": "[email protected]",
          "rank": 1
        }
      ]
    }
  ],
  "meta": {
    "request_id": "req_b0e2ba54941820e3009e83c0cd14dda6",
    "timestamp": "2026-07-20T18:22:05Z",
    "api_version": "2026-03-21"
  }
}

Magic value NO_CREDITS β†’ 402 (deterministic)

{
  "error": "Insufficient credits. Lead Builder lookup requires 10 credits per hit. You have 2 credits."
}

Reserved token INVALID_TOKEN β†’ 401

{
  "detail": "Authentication credentials were not provided."
}
REF

Response Metadata

Applies to every /v1/api/ endpoint
Description: Every response carries an X-Request-Id response header β€” a unique id Tracerfy assigns to that request. Use it to correlate a specific response with your own application logs and retries, and quote it when contacting support. The id is always assigned server-side; any X-Request-Id you send on the request is ignored.

In addition, every response whose body is a JSON object includes a meta block:
  • request_id β€” the same value as the X-Request-Id header.
  • timestamp β€” when the response was generated (ISO 8601, UTC).
  • api_version β€” the response-schema version that served the request.
meta is additive β€” new fields may be added over time, so treat unknown keys as optional and ignore them. Endpoints that return a top-level JSON array (e.g. Fetch all Queues and Fetch Single Queue) keep their bare-array body and do not include a meta block β€” read the X-Request-Id header for those. The AI-assist endpoint (/v1/api/property-search/ai-assist/) also returns no meta block (it still carries the X-Request-Id header).

Headers

  • X-Request-Id = req_1a2b3c… (present on every response)

meta block (present on every object response)

// Example: the Analytics response, with the meta block appended
{
  "total_queues": 12,
  "properties_traced": 18350,
  "queues_pending": 2,
  "queues_completed": 10,
  "balance": 940,
  "meta": {
    "request_id": "req_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d",
    "timestamp": "2026-07-16T18:22:05Z",
    "api_version": "2026-03-21"
  }
}
GET

Fetch all Queues

/v1/api/queues/
Description: Returns the authenticated user's queues as a JSON array, ordered by most recent first. Each queue represents a trace job created via API or the app. While a queue is pending, rows_uploaded and credits_deducted are hidden; when complete, download_url is populated with a CSV link.

Up to 100 queues per page. Pass ?page=N to walk back through history. Pagination metadata is in the response headers β€” X-Total-Count for the total, and Link for navigation:

Headers

  • Authorization = Bearer <YOUR_TOKEN>

Parameters

Name
In
Type
Required
Description
page
query
integer
No
Page number to return. Default: 1. 100 queues per page.

Example Request

# Default β€” page 1, latest 100 queues
curl -i -X GET 'https://tracerfy.com/v1/api/queues/' -H 'Authorization: Bearer '

# Walk back through history
curl -i -X GET 'https://tracerfy.com/v1/api/queues/?page=2' -H 'Authorization: Bearer '

Example Response 200

[
  {
    "id": 124,
    "created_at": "2025-01-02T09:30:00Z",
    "pending": true,
    "download_url": null,
    "rows_uploaded": 1800,
    "credits_deducted": 0,
    "queue_type": "api",
    "trace_type": "normal",
    "credits_per_lead": 1
  },
  {
    "id": 123,
    "created_at": "2025-01-01T12:00:00Z",
    "pending": false,
    "download_url": "https://tracerfy.nyc3.cdn.digitaloceanspaces.com/tracerfy/9a584124-77c2-4612-b8e9-f9efe6fbdc3d.csv",
    "rows_uploaded": 2500,
    "credits_deducted": 2500,
    "queue_type": "api",
    "trace_type": "normal",
    "credits_per_lead": 1
  }
]
GET

Fetch Single Queue

/v1/api/queue/:id
Description: Returns the property records associated with a queue's posted addresses. Object-level permission enforced: only the queue owner can access. Null contact fields are normalized to empty strings in the response.

One record per input row that produced a match. Input rows where no person was found at the address don't appear in this response β€” there's no record to return. For the full row-aligned view (every input row alongside whatever was found, including misses), use the CSV at download_url on the queue object β€” that file contains all rows you submitted, with empty contact columns for rows that didn't match.

Response varies based on trace_type:
β€’ Normal Trace (trace_type='normal'): Returns basic property contact data (phones and emails)
β€’ Advanced Trace (trace_type='advanced'): Finds the property owner and returns their contact data (name, phones, emails and mailing address)
β€’ Custom Trace (trace_type='custom'): Returns basic property contact data (phones, emails, mailing address)

Headers

  • Authorization = Bearer <YOUR_TOKEN>

Parameters

Name
In
Type
Required
Description
:id
path
integer
Yes
Queue ID

Example Request

curl -X GET 'https://tracerfy.com/v1/api/queue/123' -H 'Authorization: Bearer '

Example Response 200

// Normal Trace Response (trace_type='normal')
[
  {
    "address": "123 Main St",
    "city": "Austin",
    "state": "TX",
    "mail_address": "PO Box 111",
    "mail_city": "Austin",
    "mail_state": "TX",
    "first_name": "Jane",
    "last_name": "Doe",
    "primary_phone": "5125550100",
    "primary_phone_type": "Mobile",
    "email_1": "[email protected]",
    "email_2": "",
    "email_3": "",
    "email_4": "",
    "email_5": "",
    "mobile_1": "5125550100",
    "mobile_2": "",
    "mobile_3": "",
    "mobile_4": "",
    "mobile_5": "",
    "landline_1": "",
    "landline_2": "",
    "landline_3": ""
  }
]

404 β€” No queue with that ID

{
  "error": "No Queue Found with ID 123"
}

403 β€” Queue belongs to another account

{
  "error": "You do not have permission to access this queue."
}
GET

Analytics

/v1/api/analytics/
Description: Aggregated summary for your account: total_queues, properties_traced (sum of posted addresses per queue), queues_pending, queues_completed, and current credit balance.

Headers

  • Authorization = Bearer <YOUR_TOKEN>

Example Request

curl -X GET 'https://tracerfy.com/v1/api/analytics/' -H 'Authorization: Bearer '

Example Response 200

{
  "total_queues": 12,
  "properties_traced": 18350,
  "queues_pending": 2,
  "queues_completed": 10,
  "balance": 940,
  "meta": {
    "request_id": "req_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d",
    "timestamp": "2026-07-16T18:22:05Z",
    "api_version": "2026-03-21"
  }
}
POST

Batch Trace

/v1/api/trace/
Description: Asynchronous batch endpoint for processing multiple addresses at once via CSV or JSON. Specify trace_type='normal' (1 credit/lead) or 'advanced' (2 credits/lead). Cleans and de-duplicates rows, then enqueues processing in the background. If credits are insufficient the request is rejected. Returns a queue_id immediately along with estimated_wait_seconds (estimated processing time in seconds); results are delivered via download_url when complete. For single-address instant lookups, use the Instant Trace Lookup endpoint instead.

⚠️ API Usage Policy: Do not abuse API POST calls. Accounts found to be abusing the API will be put on hold. Maximum rate limit is 10 POST trace requests per 5-minute window. Please use the API responsibly and in accordance with our Terms of Service - API Rate Limits & Abuse Policy.

Headers

  • Authorization = Bearer <YOUR_TOKEN>
  • Content-Type = multipart/form-data or application/json

Parameters

Name
In
Type
Required
Description
address_column
body
string
Yes
Column for property address
city_column
body
string
Yes
Column for property city
state_column
body
string
Yes
Column for property state
zip_column
body
string
No
Property ZIP (optional β€” for advanced traces, we return this from our data if not provided)
first_name_column
body
string
Yes
Owner first name (optional for advanced traces β€” we identify the owner for you)
last_name_column
body
string
Yes
Owner last name (optional for advanced traces β€” we identify the owner for you)
mail_address_column
body
string
Yes
Mailing address (optional for advanced traces β€” we return this from our data)
mail_city_column
body
string
Yes
Mailing city (optional for advanced traces β€” we return this from our data)
mail_state_column
body
string
Yes
Mailing state (optional for advanced traces β€” we return this from our data)
mailing_zip_column
body
string
No
Mailing ZIP (optional β€” for advanced traces, we return this from our data if not provided)
trace_type
body
string
No
Trace type: 'normal' (1 credit/lead) or 'advanced' (2 credits/lead). Defaults to 'normal'. For advanced traces, only address_column, city_column, and state_column are required β€” all other fields are optional as we identify the owner and return their full contact and mailing info.
csv_file
form-data
file
Yes
CSV file of records
json_data
body
string
No
Raw JSON array of records (alternative to csv_file)

Example Request

curl -X POST 'https://tracerfy.com/v1/api/trace/' \
  -H 'Authorization: Bearer ' \
  -F 'csv_file=@/path/to/records.csv' \
  -F 'address_column=address' \
  -F 'city_column=city' \
  -F 'state_column=state' \
  -F 'zip_column=zip' \
  -F 'first_name_column=first_name' \
  -F 'last_name_column=last_name' \
  -F 'mail_address_column=mail_address' \
  -F 'mail_city_column=mail_city' \
  -F 'mail_state_column=mail_state' \
  -F 'mailing_zip_column=mailing_zip' \
  -F 'trace_type=normal'

Example Response 200

{
  "message": "Queue created",
  "queue_id": 456,
  "status": "pending",
  "created_at": "2025-01-02T10:15:00Z",
  "rows_uploaded": 100,
  "trace_type": "normal",
  "credits_per_lead": 1,
  "estimated_wait_seconds": 30,
  "meta": {
    "request_id": "req_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d",
    "timestamp": "2026-07-16T18:22:05Z",
    "api_version": "2026-03-21"
  }
}

400 β€” Column not found in your data

{
  "error": "Error in cleansing the data, please check the data and try again",
  "details": "'address' Not found in the data or not a valid column name"
}

400 β€” No usable rows

{
  "error": "No valid rows found after data cleaning. Please check your data and try again."
}

400 β€” Enhanced trace deprecated

{
  "error": "Enhanced trace has been deprecated. Please use 'normal' or 'custom' trace type."
}

403 β€” Custom trace not enabled for this account

{
  "error": "You don't have permission to use custom trace. Please contact support to enable this feature."
}

402 β€” Insufficient credits

{
  "error": "Insufficient credits for normal trace. You need 40 more credits to complete this request. Please add credits to your account or add a payment method for monthly billing."
}
POST

Instant Trace Lookup (Synchronous)

/v1/api/trace/lookup/
Description: Synchronous single-address skip trace. Returns responses immediately as JSON β€” no queue and no CSV. Ideal for one-off lookups or integrating skip trace data into your own UI at scale.

5 credits per hit, 0 credits on miss. Rate limited to 500 RPM per user.

Two lookup modes:
β€’ find_owner: true (default) β€” send only address/city/state, returns the property owner(s) and their contact info
β€’ find_owner: false β€” include first_name + last_name to search for a specific person at the address

Response includes per person: name, age, DOB, deceased flag, property owner flag, litigator flag, mailing address, all phones (with DNC + TCPA litigator status, carrier, type, rank), and all emails.

⚠️ Compliance: Phones returning litigator: true or dnc: true should not be called for telemarketing or cold outreach without documented prior express written consent. TCPA violations can carry penalties. You are solely responsible for compliance with TCPA, FDCPA, and DNC regulations. These flags are informational, not legal advice.

Headers

  • Authorization = Bearer <YOUR_TOKEN>
  • Content-Type = application/json

Parameters

Name
In
Type
Required
Description
address
body
string
Yes
Property street address
city
body
string
Yes
Property city
state
body
string
Yes
Property state (2-letter abbreviation)
zip
body
string
No
Property ZIP code. Optional but strongly recommended β€” without it, results may match a different property at a similar address in the same city.
find_owner
body
boolean
No
true (default) β€” find property owner, no name needed. false β€” find a specific person at the address, requires first_name + last_name.
first_name
body
string
No
Person's first name. Required when find_owner is false.
last_name
body
string
No
Person's last name. Required when find_owner is false.

Example Request

# Owner lookup (find property owner)
curl -X POST 'https://tracerfy.com/v1/api/trace/lookup/' \
  -H 'Authorization: Bearer ' \
  -H 'Content-Type: application/json' \
  -d '{"address": "123 Main St", "city": "Austin", "state": "TX", "zip": "78701", "find_owner": true}'

# Person lookup (find specific person at address)
curl -X POST 'https://tracerfy.com/v1/api/trace/lookup/' \
  -H 'Authorization: Bearer ' \
  -H 'Content-Type: application/json' \
  -d '{"address": "123 Main St", "city": "Austin", "state": "TX", "zip": "78701", "find_owner": false, "first_name": "Jane", "last_name": "Doe"}'

Example Response 200

// Owner lookup hit (find_owner: true) β€” 5 credits deducted
{
  "address": "123 Main St",
  "city": "Austin",
  "state": "TX",
  "zip": "78701",
  "find_owner": true,
  "hit": true,
  "persons_count": 1,
  "credits_deducted": 5,
  "persons": [
    {
      "first_name": "Jane",
      "last_name": "Doe",
      "full_name": "Jane Doe",
      "dob": "1985-03-22",
      "age": "41",
      "deceased": false,
      "property_owner": true,
      "litigator": false,
      "mailing_address": {
        "street": "PO Box 111",
        "city": "Austin",
        "state": "TX",
        "zip": "78702"
      },
      "phones": [
        {
          "number": "5125550100",
          "type": "Mobile",
          "dnc": false,
          "tcpa": false,
          "carrier": "T-MOBILE USA INC.",
          "rank": 1
        },
        {
          "number": "5125550200",
          "type": "Landline",
          "dnc": true,
          "tcpa": false,
          "carrier": "AT&T TEXAS",
          "rank": 2
        }
      ],
      "emails": [
        {
          "email": "[email protected]",
          "rank": 1
        }
      ]
    }
  ],
  "meta": {
    "request_id": "req_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d",
    "timestamp": "2026-07-16T18:22:05Z",
    "api_version": "2026-03-21"
  }
}

// Person lookup hit (find_owner: false) β€” 5 credits deducted
{
  "address": "123 Main St",
  "city": "Austin",
  "state": "TX",
  "zip": "78701",
  "find_owner": false,
  "hit": true,
  "persons_count": 1,
  "credits_deducted": 5,
  "persons": [
    {
      "first_name": "John",
      "last_name": "Smith",
      "full_name": "John Smith",
      "dob": "1978-11-03",
      "age": "47",
      "deceased": false,
      "property_owner": false,
      "litigator": false,
      "mailing_address": {
        "street": "456 Oak Ave",
        "city": "Dallas",
        "state": "TX",
        "zip": "75201"
      },
      "phones": [
        {
          "number": "2145550300",
          "type": "Mobile",
          "dnc": false,
          "tcpa": false,
          "carrier": "VERIZON WIRELESS",
          "rank": 1
        }
      ],
      "emails": [
        {
          "email": "[email protected]",
          "rank": 1
        }
      ]
    }
  ],
  "meta": {
    "request_id": "req_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d",
    "timestamp": "2026-07-16T18:22:05Z",
    "api_version": "2026-03-21"
  }
}

// Miss β€” no results found, 0 credits deducted
{
  "address": "999 Nowhere Blvd",
  "city": "Austin",
  "state": "TX",
  "zip": "78701",
  "find_owner": true,
  "hit": false,
  "persons_count": 0,
  "credits_deducted": 0,
  "persons": [],
  "meta": {
    "request_id": "req_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d",
    "timestamp": "2026-07-16T18:22:05Z",
    "api_version": "2026-03-21"
  }
}