# Skip Trace | Owner Phones & Emails — Pay Only for Hits (`thermostatic/skiptrace`) Actor

Skip tracing & people search: name, address or phone in → ranked phones (type, carrier, confidence), emails, addresses, relatives out. Name + location searches return the right person, not a namesake. Pay only for matched records. Lawful B2B use only.

- **URL**: https://apify.com/thermostatic/skiptrace.md
- **Developed by:** [Irving Ernesto Quezada Ramírez](https://apify.com/thermostatic) (community)
- **Features:** Limited permissions
- **Stats:** 3,822 total users, 156 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 person founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Skip Trace — Owner Phones & Emails | Pay Only for Hits

Find phone numbers (ranked, with type & carrier and a 0–100 confidence
score), emails, current & past addresses, relatives and associates — by
name, address, phone number, email, or property owner. Up to 7 US people-search
sources, cross-source corroboration, per-record provenance. **You are
charged only for verified matches — never for misses, never for a namesake
in another state, and never for someone who doesn't match the address,
phone or owner you searched.**

> Not for FCRA purposes (employment, credit, or tenant screening). Lawful
> B2B use only.

### Pricing

| Event | What you pay for | Free plan | Starter | Scale | Business |
|---|---|---|---|---|---|
| person-found | a verified person record (≥1 phone or email) | $0.007 | $0.0065 | $0.006 | $0.005 |
| Actor start | once per run, per GB of run memory (2 GB default = $0.02) | $0.01 | $0.01 | $0.01 | $0.01 |

Columns are your Apify subscription plan; higher plans get lower prices.

You are never charged for lookups that return nothing. In the default
smart mode you get (and pay for) one verified record per person found.
Set a hard per-run spending cap in the run options.

### Right person, verified

Every search type is checked before anything is charged:

- **Names** — `"Maria Garcia; Houston, TX"` only expands listings whose
  name matches **and** whose current or past address is in that state
  (the same city ranks first). Namesakes elsewhere are skipped for free.
  Without a location, the name must still match.
- **Addresses** — only people whose address history includes the searched
  street address are charged, not everyone who ever appeared on the page.
- **Phone numbers** — only records that list the searched number.
- **Owner + property** — only the named owner. If the owner doesn't live
  at the property (absentee owners), smart mode looks them up by name in
  the property's city and state instead of billing a tenant.
- **Emails** — the people tied to the email are looked up by name and
  city; a record is charged only if it lists the searched email.

Every row carries `input`: your original input line, so results map back
to your list even when an owner or email was resolved through a name.

### Search modes

| Mode | What it does | Best for |
|---|---|---|
| **Smart** (default) | Tries the fast sources (fastbackgroundcheck, searchpeoplefree, fastpeoplesearch) one at a time and stops as soon as the person is found with contact data | Bulk lists, dialers — lowest cost per person |
| **Smart + Deep search** | Same, but if the fast sources miss, also tries truepeoplesearch, familytreenow and radaris | Hard-to-find people; slower |
| **All sources** | Queries every selected source and returns one record per source that has the person | Maximum coverage, manual cross-checking |

For a single merged record with phones ranked by how many sources list
them, turn on cross-source corroboration.

### Example output

*Sample record, abbreviated — real rows also carry `search_input`,
`search_type`, `name_match`, `akas`, `associates` and more.*

```json
{
  "name": "Jane Sample",
  "age": 54,
  "location": "Austin, TX",
  "phones": [
    {
      "number": "(555) 010-0199",
      "line_type": "Wireless",
      "carrier": "AT&T",
      "confidence": 85,
      "confidence_reasons": ["base", "mobile", "reported 2 months ago"]
    },
    {
      "number": "(555) 010-0142",
      "line_type": "Landline",
      "carrier": "Frontier",
      "confidence": 28,
      "confidence_reasons": ["base", "landline", "reported 96 months ago"]
    }
  ],
  "emails": [{"address": "jane.sample@example.com", "status": "Current"}],
  "address_history": [
    {"address": "1200 Sample St, Austin, TX 78701",
     "county": "Travis County", "recorded": "Mar 2019 - Aug 2026"}
  ],
  "relatives": [{"name": "John Sample", "age": 57,
                 "relationship": "Spouse"}],
  "source": "fastpeoplesearch",
  "person_link": "https://www.fastpeoplesearch.com/jane-sample_id_G000"
}
```

### Benchmark (September 2026)

Default settings (smart mode, 2 GB), 18 searches: 16 common US names with
city and state, 1 property address, 1 phone number.

| Metric | Result |
|---|---|
| Searches with a verified record | 17 of 18 (94%) |
| Name searches returning the searched name in the searched state (current or past address) | 15 of 16 found, all 15 matching |
| Phones per record (mobile) | 10.8 (3.9) |
| Emails per record | 6.8 |
| Whole run, all 18 searches | 15 seconds |

A small sample: indicative, not a guarantee. Results depend on what the
sources hold for each person.

### Inputs

| Input | Format |
|---|---|
| Names | `"Amalia Castillo; Dallas, TX 75228"` (one per line) |
| Addresses | `"13770 Paseo Central Ave; Horizon City TX 79928 \| Maria Harper"` |
| Phone numbers | `"(208) 794-8562 \| Alan Harper"` |
| Owner names + property addresses | two lists paired line by line (`"Maria Harper"` + `"13770 Paseo Central Ave; Horizon City TX 79928"`) — built for property-lead lists |
| Emails | `"jane.sample@example.com"` — reverse lookup returning the full record of the person who uses it |

**Options:** search mode, deep search, sources (5 by default, 7
available), cross-source corroboration, direct connections, output profiles
(dialer / address_verification / investigation / estate / raw), min phone
confidence, concurrency and request-rate caps (automatic by default), and a
fallback proxy (US residential by default).

### FAQ

**Is this FCRA-compliant?** No — not for employment, credit, or tenant
screening. Lawful B2B use only.

**What if a source blocks my run?** In smart mode the search simply moves
on to the next source; in all-sources mode every search fans out at once.
Either way one blocked source never zeroes your run, and skipped sources
are reported in the run log. Requests go through the actor's own proxy
network first, retry blocked pages on fresh IPs, and fall back to a
residential proxy automatically.

**When is truepeoplesearch used?** In all-sources mode, or in smart mode
with Deep search on. Many of its pages need a real browser to render, so
it is slower than the fast sources.

**Do I pay for empty results?** Never.

**Does the actor collect any of my data?** No. Each run reports anonymous
usage counts (such as the number of searches, results and data transferred)
to the developer to improve reliability and cost — never your inputs,
results or any identifiers.

### Support

Run logs explain skipped records, blocked sources and their fixes. For
anything else, contact the actor author via the Issues page — issues are
answered quickly.

Found what you needed? A short [review](https://apify.com/thermostatic/skiptrace/reviews)
helps other wholesalers, collectors and investigators find this Actor.

# Actor input Schema

## `name` (type: `array`):

Full name to search, one entry per search. Optionally append a location: 'Amalia Castillo; Dallas, TX 75228'. The prefilled example is only a suggestion; API runs without names search nothing here.

## `street_citystatezip` (type: `array`):

Address to search, street and city/state/zip separated by a semicolon: '13770 Paseo Central Ave; Horizon City TX 79928'. Only people whose address history includes this address are charged. Append ' | Full Name' to pick a specific resident.

## `phone_number` (type: `array`):

Phone number to search, e.g. '(208) 794-8562'. Only records that list this number are charged. Append ' | Full Name' to pick a specific person.

## `owner_name` (type: `array`):

Property owner names, one per line, paired line-by-line with Property addresses below. Only the named owner is charged: if they are not among the property's residents, smart mode looks the owner up by name in the property's city and state.

## `property_address` (type: `array`):

Property address for each owner above (same line order), street and city/state/zip separated by a semicolon: '13770 Paseo Central Ave; Horizon City TX 79928'.

## `email` (type: `array`):

Reverse email search, one email per line: finds the people tied to the email, looks each one up by name and city, and returns the full record (phones, emails, addresses). Charged only when the returned record lists that email.

## `sources` (type: `array`):

Which data sources may be used. Smart mode tries the fast ones in its own order and adds truepeoplesearch, familytreenow and radaris only with Deep search on; all-sources mode queries every selected source. thatsthem returns discovery summaries (not charged) in all-sources mode and powers reverse email search, which always uses it.

## `search_mode` (type: `string`):

Smart tries the fast sources (fastbackgroundcheck, searchpeoplefree, fastpeoplesearch) one at a time and stops once the searched person is found with contact data, so you get and pay for one verified record per person. All sources queries every selected source and returns (and charges) one record per source that has the person.

## `deep_search` (type: `boolean`):

When the fast sources don't find the person, also try the browser-rendered sources (truepeoplesearch, familytreenow, radaris) before giving up. Finds a few more hard-to-find people; runs slower.

## `max_results` (type: `integer`):

How many people from each search's result list to expand into full records (phones, emails, address history, relatives).

## `max_concurrency` (type: `integer`):

Parallel requests. Leave empty for automatic (5). Lower it if a source starts serving challenges.

## `max_requests_per_minute` (type: `integer`):

Request-rate cap. Leave empty for automatic: 600/min through the actor's own proxy network (every request leaves from a fresh IP), 240/min on a single fallback proxy to protect its reputation. Lower it if a source starts blocking.

## `min_confidence` (type: `integer`):

Drop phones scoring below this 0-100 confidence before results are charged. 0 keeps everything.

## `fingerprint_preset` (type: `string`):

Browser fingerprint preset (e.g. chrome-latest, firefox-latest, safari-latest). Keep the default unless you have a reason.

## `proxy` (type: `object`):

Fallback proxy. Requests go through the actor's own proxy network first; this proxy is used only when that is blocked. RESIDENTIAL + US by default. If you supply your own proxyUrls, every request uses them instead.

## `output_profile` (type: `string`):

Shape dataset rows for your use case: dialer (wholesaling cold-calling), address_verification (process servers / collections), investigation (PI/OSINT, full provenance), estate (relatives graph), raw (full record).

## `corroborate` (type: `boolean`):

Query the same person on multiple sources and merge into one record per person; phones are confidence-scored (0-100) by line type, report recency and how many sources list them, ranked best-first. Slower and costlier.

## `capture_failed_html` (type: `boolean`):

For ordinary searches, save up to five unparsed detail pages (maximum 2 MB each) in this run’s key-value store. Pages may contain personal data. Does not add or charge result rows.

## `direct_first` (type: `boolean`):

Let sources that accept direct connections (fastbackgroundcheck, truepeoplesearch, familytreenow) try without a proxy before the fallback proxy. Turn off to never connect directly.

## Actor input object example

```json
{
  "name": [
    "Alan Harper"
  ],
  "sources": [
    "fastpeoplesearch",
    "fastbackgroundcheck",
    "truepeoplesearch",
    "searchpeoplefree",
    "familytreenow"
  ],
  "search_mode": "smart",
  "deep_search": false,
  "max_results": 1,
  "min_confidence": 0,
  "fingerprint_preset": "chrome-latest",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "output_profile": "raw",
  "corroborate": false,
  "capture_failed_html": false,
  "direct_first": true
}
```

# Actor output Schema

## `results` (type: `string`):

One row per person with verified contact data: ranked phones (type, carrier, confidence), emails, address history, relatives and associates. Charged per record. Misses and discovery summaries land in the separate uncharged 'summaries' dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "name": [
        "Alan Harper"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("thermostatic/skiptrace").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "name": ["Alan Harper"] }

# Run the Actor and wait for it to finish
run = client.actor("thermostatic/skiptrace").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "name": [
    "Alan Harper"
  ]
}' |
apify call thermostatic/skiptrace --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,thermostatic/skiptrace"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/i8eh5Iq4zIeHsd8Pe/builds/O53MZqoDY4QJkjhd7/openapi.json
