skiptrace
v0.6.2
Published
Skip-trace US property addresses into owner name, phone numbers, and emails — as a CLI or a JS/TS library. Single lookups or bulk CSV, powered by DataSkip.
Maintainers
Readme
skiptrace
Skip-trace US property addresses into owner contact details, right from your terminal. Look up a property owner's name, phone numbers (with DNC flags), emails, and mailing address — one address or a whole CSV. Powered by DataSkip; you pay per match, misses are free.
Skip tracing for real estate, lead generation, and contact enrichment.
🔗 dataskip.io · Sign up, manage billing, and view your dashboard.
📚 Skip tracing API docs · Pricing & rates
Install
npm install -g skiptraceOr run locally from this repo:
cd services/cli
npm install
npm run build
npm link # makes `skiptrace` available globally from sourceAuthenticate
Create an API key in the DataSkip dashboard (Settings → API), then:
skiptrace config set-key pc_xxxxxxxxxxxxxxxxxxxxxxxxThe key is stored in ~/.skiptrace/config.json (owner-readable only). You can
also pass it per-call with --key, or set SKIPTRACE_API_KEY in your env.
Usage
# Simplest — pass a full address string
skiptrace "1252 E 21st St, Erie PA 16503"
# Explicit components (override the parsed string)
skiptrace lookup "44 Pine St" --city Bridgewater --state MA --zip 02324
# Raw JSON (for scripting / jq)
skiptrace "123 Main St, Austin TX 78701" --jsonExit codes
| Code | Meaning | |------|----------------------------------| | 0 | Match found | | 1 | No match (address not in DB) | | 2 | Usage error (missing key/address)| | 3 | API or network error |
This lets you branch in scripts:
if skiptrace "$addr" --json > out.json; then
echo "hit"
else
echo "miss or error"
fiUse as a library (JS / TS)
The same package works as a programmatic API — import it into your own code:
import { SkipTrace } from 'skiptrace';
const st = new SkipTrace({ apiKey: process.env.SKIPTRACE_API_KEY });
const result = await st.skip('1252 E 21st St, Erie PA 16503');
if (result.found) {
console.log(result.contact.fullName, result.phones, result.emails);
}One-shot form:
import { skip } from 'skiptrace';
const result = await skip('1252 E 21st St, Erie PA 16503', { apiKey: 'pc_...' });Structured input and error handling:
import { SkipTrace, ApiError } from 'skiptrace';
const st = new SkipTrace({ apiKey: 'pc_...' });
try {
const r = await st.skip({ address: '44 Pine St', city: 'Bridgewater', state: 'MA', zip: '02324' });
} catch (err) {
if (err instanceof ApiError && err.status === 402) {
// insufficient balance
}
}Bulk lookups — skipBulk() takes an array of up to 100 addresses (free-form strings or structured objects, mixable) and returns per-address results in order. The full batch is charged up front (a 402 ApiError if your balance can't cover it) and non-matches are refunded automatically when the request completes, so the net cost is matches only:
const bulk = await st.skipBulk([
'1252 E 21st St, Erie PA 16503',
{ address: '44 Pine St', city: 'Bridgewater', state: 'MA', zip: '02324' },
]);
console.log(`${bulk.matched} of ${bulk.total} matched, charged ${bulk.totalCharged} cents`);
for (const r of bulk.results) {
if (r.found) console.log(r.contact.fullName, r.phones, r.emails);
}apiKey falls back to SKIPTRACE_API_KEY, then ~/.skiptrace/config.json (from
skiptrace login), so in your own environment you can also just set the env var
and call new SkipTrace() with no arguments. Full TypeScript types are included.
Config
skiptrace config show # show current key (masked) + URL
skiptrace config set-key <key> # save API key
skiptrace config set-url <url> # point at a different environmentResolution order for both key and URL: flag → env var → config file → default
(SKIPTRACE_API_KEY / SKIPTRACE_API_URL; default URL https://app.dataskip.io).
