npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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.

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 skiptrace

Or run locally from this repo:

cd services/cli
npm install
npm run build
npm link          # makes `skiptrace` available globally from source

Authenticate

Create an API key in the DataSkip dashboard (Settings → API), then:

skiptrace config set-key pc_xxxxxxxxxxxxxxxxxxxxxxxx

The 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" --json

Exit 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"
fi

Use 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 environment

Resolution order for both key and URL: flag → env var → config file → default (SKIPTRACE_API_KEY / SKIPTRACE_API_URL; default URL https://app.dataskip.io).

Links