# DataSkip Developers: Skip Tracing API, CLI, and SDK

> Machine-readable mirror of https://dataskip.io/developers for AI agents. Rendered page: https://dataskip.io/developers · API overview: https://dataskip.io/skip-tracing-api.md · Full site summary: https://dataskip.io/llms.txt

Turn a US property address into the owner's name, phone numbers with DNC flags, emails, and mailing address. One npm package gives you a CLI and a typed JS/TS SDK; the REST API works from any language. Same flat 4 cents per match as the dashboard, and misses are always free.

## npm package `skiptrace`

- Install: `npm install -g skiptrace` (Node 18+, Apache-2.0)
- CLI: `skiptrace "123 Example St, Phoenix AZ 85001"`
- CLI exit codes: 0 match, 1 miss, 2 usage error, 3 API error
- SDK: `import { SkipTrace } from 'skiptrace'` then `await st.skip(address)`

## REST API

- Endpoint: POST https://app.dataskip.io/api/v1/skip-trace
- Auth: `Authorization: Bearer <api key>` (create keys in the dashboard at https://app.dataskip.io under Settings, API)
- Pricing: 4 cents per matched lookup, misses are always free (a miss returns HTTP 200 with `found: false`)
- 402 response means insufficient balance
- Rate limit: 250 single lookups per minute per account; use the bulk pipeline for lists

## Bulk API (CSV jobs)

For lists, do not loop the single-lookup endpoint. The bulk pipeline processes up to 250,000 records in one job and never charges before the previewed cost is confirmed.

1. `POST /api/user/skip-trace` creates a job. Body: `{ "filename": "leads.csv", "columnMapping": { "address": "Property Address", "city": "City", "state": "State", "zip": "Zip" } }` (only the address column is required). Returns `jobId` and `uploadUrl`.
2. Upload the raw CSV. Presigned: PUT to `uploadUrl` with `Content-Type: text/csv`, then `POST /api/user/skip-trace/{jobId}/uploaded`. Direct: POST the file as multipart form data (field name `file`).
3. Poll `GET /api/user/skip-trace/{jobId}` until status is `preview`: it reports `totalRows`, `matchedRows`, and `totalChargeCents`.
4. `POST /api/user/skip-trace/{jobId}/confirm` to charge (matched rows only, 4 cents each; 402 if the balance cannot cover it), or `POST /api/user/skip-trace/{jobId}/cancel` to abort with no charge.
5. Poll until `completed`, then download the enriched CSV from `downloadUrl`. Matched rows gain owner names, phones, and emails; unmatched rows come back unchanged.

`GET /api/user/skip-trace` lists the account's 50 most recent jobs. Job statuses: pending, uploaded, processing, preview, confirmed, generating, completed, failed, cancelled.

## Data dictionary (returned per hit)

- Owner name: first, middle, last, and full name
- Property address: street, city, state, ZIP
- Mailing address: included when it differs from the property address (absentee owner signal)
- Mobile phones: up to 10 per hit
- Landlines: up to 9 per hit
- Emails: up to 28 per hit
- DNC flag: returned per phone number (Do Not Call registry status)

A miss returns HTTP 200 with `found: false` and costs nothing. There is no partial charge: a record either hits (4 cents) or misses (free).

## Facts

- Hits return owner contact data: names, up to 10 mobile phones, up to 9 landlines, up to 28 emails, property and mailing address, DNC flags on phones
- No minimum order, no subscription required, flat rate at any volume
- US properties only, all 50 states
- Typical lists see a 98.9% hit rate

Rates: https://dataskip.io/pricing · Docs page: https://dataskip.io/developers · Sign up: https://app.dataskip.io/signup
