# Skip Trace Lookup | TruePeopleSearch & FastPeopleSearch (`themineworks/skip-trace-lookup`) Actor

Look up a person by name, city/state, or phone number across TruePeopleSearch and FastPeopleSearch public records - current city, age, phone numbers, and possible relatives. No login or API key. Not for FCRA-regulated screening use.

- **URL**: https://apify.com/themineworks/skip-trace-lookup.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Lead generation, Real estate, MCP servers
- **Features:** Limited permissions
- **Stats:** 112 total users, 28 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.60 / 1,000 person rows

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 Lookup | TruePeopleSearch & FastPeopleSearch

[![9 people found, every one with phone numbers: a test run of 2 name searches returned 9 matched people from FastPeopleSearch, each with 4 to 27 phone numbers](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/skip-trace-lookup-hero-fix0930.png)](https://console.apify.com/actors/VdFDo1odlQ1zb8Mbu/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 290,000 runs across our actors.

> **Not for FCRA-regulated screening.** This actor is not a consumer reporting agency product. Its output must not be used, in whole or in part, for any decision covered by the US Fair Credit Reporting Act or similar laws: credit, employment, tenant or rental screening, insurance, or any other purpose that needs an FCRA-compliant consumer report. It is for lawful re-contact only, such as finding a current city for someone you already have a lawful reason to reach. If your use falls under the FCRA, use a licensed consumer reporting agency instead.

### Why choose this actor?

- **Phone numbers on every verified row.** A test run of 2 name searches (name, city and state) returned 9 matched people in 111 seconds, each with 4 to 27 phone numbers and their line type (wireless, landline or VoIP), plus age, current city, past cities, possible relatives and the source's profile link. No account on either site and no login.
- **One price per person row, labelled.** Every person row is charged one event and says what it is in `match_quality`: `verified` (the name you searched, a tie to your city or state, and phone numbers), `no_phone`, `no_place_tie`, `name_variant` or `other_name` (another person the site listed). Turn on `onlyVerified` to receive, and pay for, verified rows only.
- **Failed lookups cost nothing.** A lookup that is blocked, times out or finds nobody produces no row and no charge.
- **A hard cap on every run.** You pay $3.60 to $6.00 per 1,000 person rows, plus $0.005 per run to start. `maxResultsPerSearch` (10 to 20, default 10) keeps at most 20 rows per search per site and a run takes at most 25 searches, so a single run can never bill more than 1,000 rows.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/VdFDo1odlQ1zb8Mbu/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Leads and business directories family:** [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [JustDial Scraper](https://apify.com/themineworks/justdial-business?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Yandex Maps Scraper](https://apify.com/themineworks/yandex-maps-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [IndiaMART Scraper](https://apify.com/themineworks/indiamart-suppliers?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input's JSON tab and start the run. It runs two name searches on FastPeopleSearch and keeps up to 5 matched people each; a recorded run of this input returned 9 people, all with phone numbers, in 111 seconds.

```json
{
  "searches": [
    { "fullName": "Robert Brown", "city": "Phoenix", "state": "AZ" },
    { "fullName": "Linda Miller", "city": "Denver", "state": "CO" }
  ],
  "sources": ["fastpeoplesearch"],
  "maxResultsPerSearch": 5
}
```

Each entry in `searches` is one lookup, given one of two ways: a name in `fullName` (optionally narrowed with `city` and a two letter `state`), or a phone number in `phone` for a reverse phone lookup. `name` is accepted as another spelling of `fullName`. Up to 25 searches per run; entries with neither a name nor a phone are ignored. We left TruePeopleSearch out of this example because it rarely answers (result cards on 2 of 17 tries on 30 September) and gives no phone numbers (see the FAQ); add `"truepeoplesearch"` to `sources` to query it as well.

Apify's free plan includes $5 of credit every month, which covers about 825 person rows at this actor's price (the Free plan rate of $0.006 per row, plus the $0.005 start fee on each of 10 runs at the default memory).

#### Copy to your AI assistant

```
themineworks/skip-trace-lookup on Apify. Looks up people by name (optionally city and state) or by phone number on the public pages of FastPeopleSearch and TruePeopleSearch, with no login, and returns matched people with phone numbers (from FastPeopleSearch's free person page), age, current city, past cities, possible relatives and the source's profile link. Not for any FCRA-regulated purpose (credit, employment, tenant screening, insurance). Call ApifyClient("TOKEN").actor("themineworks/skip-trace-lookup").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: searches (list of objects, each with fullName and optional city and state, or with phone; up to 25). Optional: sources (default ["truepeoplesearch", "fastpeoplesearch"]), maxResultsPerSearch (default 10, 10 to 20, person rows per search per site, exact names first, then related names), reuseHours (default 24, 0 to 48: pages looked up in the last N hours are reused), onlyVerified (default false; true delivers and charges only verified rows), monitorMode (default false; true delivers and charges only rows new or changed since an earlier run with the same input). Record rows have no _type field; each run adds one row with _type "summary" and, when it delivered records, one with _type "info"; neither is charged. Every person row is charged once and labelled in match_quality: verified (exact first and last name, a tie to the given place, at least one phone number), no_phone, no_place_tie, name_variant or other_name. Other people the site listed come last as other_name rows, also charged. Rows are still candidates for the person you mean, not confirmed identities. Full spec: GET https://api.apify.com/v2/acts/themineworks~skip-trace-lookup/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **Two public directories, one input.** FastPeopleSearch and TruePeopleSearch, the two widely used US people-search sites whose results pages need no account and no payment. Pick one or both in `sources`.
- **Name search and reverse phone lookup.** A name with an optional city and state, or a 10 digit US phone number (FastPeopleSearch). Punctuation in the phone number does not matter.
- **Phone numbers with line type.** For each matched person the actor opens the free FastPeopleSearch person page and returns every number listed there (`phone_numbers`), with type, carrier and first reported month in `phone_details`. Only that person's own phone block is read, not the relatives' numbers elsewhere on the page.
- **Up to 8 facts per person.** `full_name`, `age`, `current_location`, `previous_locations` (cities and states from the full address history, no street addresses), `possible_relatives`, `phone_numbers`, `phone_details` and `profile_url`, with your search echoed back on every row (`query_full_name`, `query_city`, `query_state` or `query_phone`) so a batch stays easy to join to your own list.
- **Match labels on every row.** `name_match` (`exact` or `similar`) and `location_match` (`current`, `previous`, `same_state` or `none`) say how the record relates to your search, and `billable` says whether it was charged.
- **Batch up to 25 searches per run.** Six lookups run at once. With both sources and the maximum `maxResultsPerSearch` of 20, one run returns at most 1,000 person rows.
- **Pay per person row; failed lookups are free.** A lookup that is blocked, times out or finds nobody produces no row and no charge. Every person row delivered is charged once, with `match_quality` saying whether it is verified. With `onlyVerified` on, only verified rows are delivered. Each search request gets 20 seconds and up to 3 tries on a fresh session, each person page up to 2 tries.
- **No browser, no account.** Requests go through Apify's unblocker proxy as plain HTTP, and the actor never signs in to either site or buys a report.

### How to use it

#### Basic: one person, one city

```json
{
  "searches": [
    { "fullName": "John Smith", "city": "New York", "state": "NY" }
  ],
  "sources": ["fastpeoplesearch"],
  "maxResultsPerSearch": 5
}
```

A common name returns several people with the same name. Only records with that exact first and last name and an address in New York state are kept; use `age`, `previous_locations` and `possible_relatives` to decide which one, if any, is the person you mean.

#### Several people in one run

```json
{
  "searches": [
    { "fullName": "Maria Garcia", "city": "Houston", "state": "TX" },
    { "fullName": "James Johnson", "city": "Chicago", "state": "IL" },
    { "fullName": "Linda Miller", "state": "CO" }
  ],
  "sources": ["fastpeoplesearch"],
  "maxResultsPerSearch": 3
}
```

Every row carries the search it came from, so after the run you can group rows by `query_full_name` and match them back to your list. A state without a city is allowed; it widens the search, and a record then needs an address anywhere in that state.

#### Refreshing a stale contact list

For a list of past customers or members whose last known city you have, send up to 25 names per run with that city and state, keep `maxResultsPerSearch` low (2 or 3), and compare each record with your own before you treat it as the same person. Rows with `location_match` `current` or `previous` (your last known city is in the person's address history) and an age that fits are the strongest; `same_state` means the person lived elsewhere in that state. Save the input as a task and re-run it monthly for records that are still unresolved; people do not move often, so a tighter schedule mostly costs more for the same answer. With `monitorMode` on, each monthly run delivers and charges only rows that are new or changed (see Run it on a schedule).

#### Reverse phone lookup

```json
{
  "searches": [
    { "phone": "212-555-0100" }
  ],
  "sources": ["fastpeoplesearch", "truepeoplesearch"]
}
```

The number above is a placeholder from the input form; use the number you actually need to identify. A reverse phone lookup reads FastPeopleSearch's phone page and keeps and charges every person it lists for the number; it does not open person pages, so `phone_numbers` holds only what the results card shows. TruePeopleSearch is not used for phone lookups: it answers automated phone searches with a captcha page. In our 4 October test of 8 US business numbers, 7 returned people, 43 in all (1 to 9 per number). A number that is not a 10 digit US number (or 11 digits starting with 1) is skipped before any request and costs nothing.

#### Both sources, when you want the widest net

```json
{
  "searches": [
    { "fullName": "Robert Brown", "city": "Phoenix", "state": "AZ" }
  ],
  "sources": ["truepeoplesearch", "fastpeoplesearch"],
  "maxResultsPerSearch": 5
}
```

Querying both sources can add people that only one site has, but TruePeopleSearch rows come without phone numbers (the actor has no reader for its person pages yet), so they arrive as `no_phone` rows and are charged as rows unless `onlyVerified` is on. Querying both also adds up to 60 seconds per search when TruePeopleSearch is slow; after two failed TruePeopleSearch lookups with no success, the run skips its remaining ones. Failed lookups are never charged.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `searches` | array | none (required) | The lookups. Each entry is an object with `fullName` (optional `city` and `state`) or with `phone`. Up to 25 per run; more are ignored. |
| `sources` | array | `["truepeoplesearch", "fastpeoplesearch"]` | Which sites to query for every search: `truepeoplesearch`, `fastpeoplesearch`, or both. |
| `maxResultsPerSearch` | integer | `10` | Most person rows per search, per site, 10 to 20 (a lower value is treated as 10). Rows with the exact name you searched come first, then related names (same last name, or a first name starting the same way). Every row delivered is charged. Each exact name row costs one more page load for its phone numbers, so this also bounds run time on a common name. |
| `onlyVerified` | boolean | `false` | Off: every person row found is delivered and charged, labelled in `match_quality`. On: only `verified` rows (the name you searched, a tie to your city or state, phone numbers) are delivered and charged. |
| `reuseHours` | integer | `24` | A search or person page your account already looked up in the last this many hours (0 to 48) is reused instead of fetched again, so a repeated search returns faster with the same rows. Only pages that returned people are kept, in key value stores in your own Apify account named `skip-trace-lookup-pages` plus the date, each deleted after 2 days. `0` turns it off and keeps nothing. |
| `monitorMode` | boolean | `false` | Deliver only person rows that are new or whose listing changed since an earlier run with the same input. Unchanged rows are not charged. Made for monthly schedules. |

### What data do you get?

One row per matched person, per source, plus one summary row per run. Record rows have no `_type` field.

**Your search, echoed back:** `query_full_name`, `query_city`, `query_state` on a name search, or `query_phone` on a reverse phone lookup. A query field you did not send is left out of the row.

**The person:** `full_name` (as the site shows it), `age` (left out when the site shows none), `current_location` (city and state), `previous_locations` (cities and states from the search card and the full address history on the person page; no street addresses), `possible_relatives` (names the site lists as related), `profile_url` (the person's page on the source site).

**Phone numbers:** `phone_numbers` (every number in the person's own phone block on the FastPeopleSearch person page, as the site writes them, for example `(555) 010-0100`) and `phone_details` (one entry per number: `number`, `type` such as `Wireless`, `Landline` or `Voip`, `carrier`, `first_reported` such as `November 2011`). `phone_lookup_status` is `ok` when the person page was read, `blocked` when it did not load after 2 tries, and `unsupported` on TruePeopleSearch rows. Numbers the site lists are not checked for being current.

**How it matches your search:** `name_match` is `exact` (same first and last name; a middle name, initial or suffix such as Jr is ignored) or `similar` (a variant such as Johnny or Jack for John, or Smithson for Smith). `location_match` is `current` (lives in the city you gave), `previous` (lived there before), `same_state` (lives or lived elsewhere in that state, such as Brooklyn for New York) or `none`; it is left out when you gave no city or state. `match_quality` says what each charged row is (`verified`, `no_phone`, `no_place_tie`, `name_variant`), and `note` explains any row that is not verified.

**Where it came from:** `source` (`fastpeoplesearch` or `truepeoplesearch`), `resolved` (always `true` on a delivered row), `scraped_at`.

**Summary row** (`_type: "summary"`, never charged): `searches`, `sources_used`, `only_verified`, `charging`, `matched` and `verified_rows` (verified rows delivered), `other_rows` (no_phone, no_place_tie and name_variant rows delivered), `charged`, `no_phone_seen`, `name_variants_seen`, `no_place_tie_seen`, `rows_left_out_only_verified`, `detail_pages_fetched`, `detail_pages_blocked`, `blocked` (search lookups that failed after 3 tries), `lookups_skipped_source_down`, `stopped_early` and a few cost guard counters. **Info row** (`_type: "info"`, never charged): on runs that delivered records, the count and a note on scheduling. With monitor mode on, record rows also carry `monitor_status` (`new` or `changed`), and a last info row gives the monitor counts.

#### Stable fields for automations

These fields were present on all 9 record rows of our recorded two search run of the current version (30 September, FastPeopleSearch). Their names will not change, so a sheet, CRM import or n8n flow can map them once.

| Field | What it is |
|---|---|
| `source` | `fastpeoplesearch` or `truepeoplesearch` |
| `query_full_name` | The name you searched (name searches) |
| `query_city` | The city you searched, when you sent one |
| `query_state` | The state you searched, when you sent one |
| `full_name` | The person's name as the site shows it |
| `current_location` | Current city and state |
| `previous_locations` | Past cities and states; an empty list when none |
| `possible_relatives` | Related names; an empty list when none |
| `phone_numbers` | Phone numbers from the person page; an empty list on a `no_phone`, `no_place_tie`, `name_variant` or `other_name` row |
| `phone_details` | Type, carrier and first reported month per number |
| `name_match` | `exact` or `similar` (name searches) |
| `location_match` | `current`, `previous`, `same_state` or `none` (when you gave a place) |
| `billable` | `true` when the row was charged |
| `profile_url` | The person's page on the source site |
| `resolved` | Always `true` |
| `scraped_at` | When the row was written |

`age` was on all 9 rows of the recorded two search run, but some sites leave it out, so treat it as optional. On a reverse phone lookup the `query_*` name fields are replaced by `query_phone`, and `name_match`, `location_match`, `phone_details` and `phone_lookup_status` are left out.

#### Output examples

Personal details below are masked: every name and city keeps only its first letter, phone digits and profile IDs are hidden. The field layout, counts and the unmasked parts are exactly as delivered, except that `phone_details` is cut to its first 2 of 9 entries.

**A matched person, charged** (30 September test run of the current version, search "Linda Miller", Denver, CO):

```json
{
  "query_full_name": "Linda Miller",
  "query_city": "Denver",
  "query_state": "CO",
  "source": "fastpeoplesearch",
  "full_name": "L**** M*****",
  "age": 89,
  "current_location": "R*****, AR",
  "previous_locations": [
    "R*****, AR",
    "W**********, CO",
    "D*****, CO",
    "M***, MO",
    "F*** S****, KS",
    "W**** R****, CO",
    "B**** V****, AR",
    "A*****, CO",
    "G****, CO",
    "W*******, FL",
    "L********, CO",
    "B*********, CO",
    "P*****, IL",
    "L*******, CO"
  ],
  "phone_numbers": [
    "(***) ***-****",
    "(***) ***-****",
    "(***) ***-****",
    "(***) ***-****",
    "(***) ***-****",
    "(***) ***-****",
    "(***) ***-****",
    "(***) ***-****",
    "(***) ***-****"
  ],
  "possible_relatives": [
    "D******* F******",
    "E**** F******",
    "J*** F******",
    "C*** F******",
    "C**** F******"
  ],
  "profile_url": "https://www.fastpeoplesearch.com/l****-*****_id_*********************",
  "resolved": true,
  "name_match": "exact",
  "phone_details": [
    {
      "number": "(***) ***-****",
      "type": "Landline",
      "carrier": "Qwest Corporation",
      "first_reported": "November 2011"
    },
    {
      "number": "(***) ***-****",
      "type": "Landline",
      "carrier": "Qwest Corporation",
      "first_reported": "August 2010"
    }
  ],
  "phone_lookup_status": "ok",
  "location_match": "previous",
  "billable": true,
  "scraped_at": "2026-09-30T08:21:30.920Z"
}
```

The person lives in another state now; Denver is in the address history, so `location_match` is `previous`. That is the usual skip trace case: the city you have is where the person used to live.

**Other rows** look the same, with `match_quality` and a `note`: `no_phone` ("No phone number listed for this person.", "The person page with phone numbers did not load." or, for TruePeopleSearch, "Phone numbers are read from FastPeopleSearch person pages only."), `no_place_tie` ("The searched name, but no address in the city or state you gave.") and `name_variant` ("A similar name to the one you searched (for example Johnny for John)."). Each is charged as one row unless `onlyVerified` is on.

**The summary row** (same run: 2 searches on FastPeopleSearch; 9 matched people delivered and charged, 10 name variants left out):

```json
{
  "_type": "summary",
  "searches": 2,
  "sources_used": [
    "fastpeoplesearch"
  ],
  "only_verified": false,
  "matched": 9,
  "charged": 9,
  "no_phone_seen": 0,
  "name_variants_seen": 10,
  "no_place_tie_seen": 0,
  "rows_left_out_only_verified": 0,
  "detail_pages_fetched": 9,
  "detail_pages_blocked": 0,
  "blocked": 0,
  "lookups_skipped_source_down": 0,
  "stopped_early": false,
  "requests": 11,
  "delivered": 9,
  "est_spend_usd": 0.0055,
  "est_revenue_usd": 0.0259,
  "profit_guard_tripped": false,
  "scraped_at": "2026-09-30T08:22:59.717Z"
}
```

### Pricing

Pay per event: one `person-matched` event for each person row delivered, plus Apify's start event per run. Since 3 October 2026 this is per row: verified rows and the other labelled rows alike. Turn on `onlyVerified` to receive and pay for verified rows only.

| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Person row (`person-matched`), per row | $0.006 | $0.005 | $0.004 | $0.0036 |
| Per 1,000 person rows | $6.00 | $5.00 | $4.00 | $3.60 |
| Run start (`apify-actor-start`), per GB of memory | $0.005 | $0.005 | $0.005 | $0.005 |

**The start fee, exactly.** `apify-actor-start` is charged once when a run starts, one event per GB of memory with a minimum of one. At the default 512 MB, and at 1 GB, that is $0.005 per run. This actor does not need more than 512 MB.

**Charged:** each person row delivered, once. On a name search that is every row up to `maxResultsPerSearch` per site (default 10): rows with the exact name you searched first, then related names (the same last name, or a first name starting the same way, such as Rob or Roberto for Robert), then other people the site listed for your search. Each row is labelled in `match_quality` (`verified`, `no_phone`, `no_place_tie`, `name_variant`, `other_name`). With `onlyVerified` on, only `verified` rows are delivered and charged. On a reverse phone lookup, each person the site lists for the number.

**Never charged:** a lookup that is blocked or times out after 3 tries, a search that finds nobody, the summary row and the info row.

**What real jobs cost on Gold:** 25 searches on one source at 5 rows each, 125 rows at most, cost at most $0.45 plus $0.005. The recorded 9 person run costs $0.032 plus $0.005.

There is no price change scheduled for this actor. The Pricing tab on this page always shows the rate for your own plan.

### Run it on a schedule

Switch on `monitorMode` to keep a contact list fresh without paying for the same answers again. The first run delivers every row. After that, a person row comes back only when what the site lists for that person changes: a new phone number, a move, a new age or a change in relatives or match quality. You pay only for the rows delivered.

1. Fill in the input, tick **Monitor mode**, and save it as a task.
2. In Apify Console open **Schedules**, click **Add schedule**, and pick **Monthly** (or a cron such as `0 9 1 * *`).
3. Add the saved task to the schedule and click **Save**.

```json
{
  "searches": [
    { "fullName": "Robert Brown", "city": "Phoenix", "state": "AZ" }
  ],
  "sources": ["fastpeoplesearch"],
  "onlyVerified": true,
  "monitorMode": true
}
```

Each delivered row carries `monitor_status`: `new` the first time, `changed` when the listing differs from the version you last received. An unchanged row is looked up but not delivered and not charged; the start fee applies to every run as usual. A row whose person page did not load on a run is never sent as a change; it waits for a run where the page loads. The last row of each run (`_type: "info"`) gives `new_this_run`, `changed_this_run` and `skipped_already_seen`. The history belongs to the input: change `searches`, `sources` or `onlyVerified` and a new history starts; change `maxResultsPerSearch` or `reuseHours` and it carries on.

### FAQ

**What are TruePeopleSearch and FastPeopleSearch?**
Free, ad supported US people-search directories that compile public records into a results page per name or phone number, and a free page per person. This actor reads the results pages and, on FastPeopleSearch, the free person page of each matched person for the phone numbers. Both are public pages that each site's robots.txt allows. It never signs in and never buys a report.

**Is this a background check? Can I use it for tenant, employment or credit screening?**
No. It is not an FCRA consumer report, and using it for credit, employment, tenant or rental screening, insurance or any other FCRA-covered purpose is outside its intended use and may be against the law. Use a licensed consumer reporting agency for those decisions. Both source sites carry the same restriction.

**Does it return phone numbers?**
Yes, from FastPeopleSearch. Neither site prints phone numbers on its search results, which is why earlier versions returned an empty `phone_numbers` on every row. Since 30 September the actor opens each matched person's free FastPeopleSearch page and reads the phone block there: in our two recorded runs of the current version, all 18 charged FastPeopleSearch rows had phone numbers, 4 to 40 each. A matched person with no number listed arrives as a `no_phone` row, and TruePeopleSearch rows carry no phone numbers; both are charged as rows unless `onlyVerified` is on. No email addresses are returned.

**Why does TruePeopleSearch return so little?**
Its results page rarely gets through the unblocker proxy: on 30 September it returned result cards on 2 of 17 tries, and the rest timed out or came back empty (it also returned nothing in our 1 September platform run). Its person pages could therefore not be studied, so its rows carry no phone numbers; they arrive as `no_phone` rows, charged as rows unless `onlyVerified` is on. Failed lookups are not charged, and after two failures with no success the run skips its remaining TruePeopleSearch lookups. Choose `["fastpeoplesearch"]` in `sources` for faster runs.

**How accurate is a match?**
There is no confidence score, but every row says how it matched. A site's name search also returns variants: a search for John Smith returned Johnnie, Johnny and Jack Smith, and one for Maria Garcia returned Maria Garza. Those get `name_match: "similar"` and `match_quality: "name_variant"`, and are charged as rows unless `onlyVerified` is on. Other people the site lists for your search come last, as `other_name` rows, also charged unless `onlyVerified` is on. A record with the exact name but no address in the city or state you gave arrives as `no_place_tie`. With `onlyVerified` on, only `verified` rows are delivered. A kept record can still be a different person with the same name, so confirm identity with `age`, `previous_locations` and `possible_relatives`.

**How many results can I get?**
Up to `maxResultsPerSearch` (10 to 20, default 10) per search per site, and up to 25 searches per run: at most 1,000 rows per run. Split a longer list across runs.

**How fresh is the data?**
Each run reads the sites live. The sites themselves compile public records with their own delays, so a recent move may not show yet.

**Why did a search return zero results?**
The person is not in that site's index under the name and place you gave, every record the site returned was a name variant or had no address in your city or state, or the lookup was blocked or timed out after 3 tries. The summary row's `name_variants_seen`, `no_place_tie_seen` and `blocked` counts tell you which. None of these is charged. Try with only the state, or turn on `includeWeakMatches` to see the other records free.

**Do I need an account or cookies on either site?**
No. Neither results page needs an account, and the actor never creates or simulates one.

**Why are Spokeo, BeenVerified, TruthFinder and PeopleFinders not included?**
When we tested them, each kept real contact details behind a paid subscription or an account wall, so there was no usable public results page to read.

**How do I export the data?**
From the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. CSV flattens the lists of past cities and relatives into columns.

**Can I use it from Claude, ChatGPT or another AI assistant?**

- Connector URL: `https://mcp.apify.com/?tools=themineworks/skip-trace-lookup`.
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http skip-trace-lookup "https://mcp.apify.com/?tools=themineworks/skip-trace-lookup"`.

**Is it legal to use this data?**
The actor reads only public results pages that anyone can open without an account or payment. The data is still personal data: names, ages, places lived and family connections. You are solely responsible for having a lawful purpose and for complying with the FCRA, the GLBA, state data broker and privacy laws, the CCPA, the GDPR where it applies, and each site's terms. Do not use it to harass, stalk or locate anyone who does not want to be found. This is general information, not legal advice; when in doubt, ask your own counsel.

### Integrations

- **Google Sheets:** send each run's records to a sheet with Apify's Google Sheets integration, then match them to your list on `query_full_name`.
- **Make, Zapier and n8n:** start runs and read datasets with the official Apify apps and nodes.
- **Webhooks:** get a call to your own URL when a run succeeds, then fetch its dataset.
- **API and SDKs:** the Apify API and the Python and JavaScript clients.
- **MCP clients:** Claude, ChatGPT, Cursor and others through `https://mcp.apify.com/?tools=themineworks/skip-trace-lookup`.

### More from The Mine Works

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [JustDial Scraper](https://apify.com/themineworks/justdial-business?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Yandex Maps Scraper](https://apify.com/themineworks/yandex-maps-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [IndiaMART Scraper](https://apify.com/themineworks/indiamart-suppliers?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Contact Details Scraper](https://apify.com/themineworks/website-contact-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [US Business Registry](https://apify.com/themineworks/us-state-business-registry?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Scraper](https://apify.com/themineworks/google-maps-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Yellow Pages Scraper](https://apify.com/themineworks/yellowpages-us?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Lead Generation MCP](https://apify.com/themineworks/lead-generation-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Reviews Scraper](https://apify.com/themineworks/google-maps-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a bug or need a field? Open an issue on the Issues tab of this actor. To ask for a new source, email dmineworks@gmail.com.

*Skip Trace Lookup returns matched people with phone numbers from FastPeopleSearch and TruePeopleSearch public pages by name or phone, with no login and nothing charged for failed lookups, name variants or records without a phone number, for lawful re-contact only and never for FCRA-regulated screening.*

# Actor input Schema

## `searches` (type: `array`):

List of people to look up. Each entry needs EITHER a name (fullName, optionally with city/state to narrow it) OR a phone number (for a reverse phone lookup). Example: \[{"fullName": "John Smith", "city": "New York", "state": "NY"}, {"phone": "212-555-0100"}]

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

Which public people-search sites to query for each search, e.g. TruePeopleSearch or FastPeopleSearch. Select one or both; more sources means more matches but a longer run.

## `maxResultsPerSearch` (type: `integer`):

Most person rows per search per site, 10 to 20 (a lower value is treated as 10). Rows with the exact name you searched come first, then related names, then other people the site listed. Each row delivered is charged.

## `onlyVerified` (type: `boolean`):

Off (default): every person row found is delivered and charged as one row, each labelled in match_quality: verified (the name you searched, a tie to your city or state, and phone numbers), no_phone, no_place_tie, name_variant or other_name (another person the site listed). On: only verified rows are delivered and charged.

## `reuseHours` (type: `integer`):

A search or person page this account already looked up in the last this many hours (0 to 48) is reused instead of fetched again, so a repeated search comes back faster and with the same rows. Only pages that returned people are kept, and only the records a row can come from, in key value stores named skip-trace-lookup-pages plus the date in your account, one per day, each deleted after 2 days. 0 turns this off and keeps nothing.

## `monitorMode` (type: `boolean`):

Run on a schedule and deliver ONLY person rows that are new or whose listing changed since a previous run (a new phone number, a move, a new age). You are charged per delivered row, not for every row each time. Ideal for monthly checks of a contact list. Requires the same input across runs.

## Actor input object example

```json
{
  "searches": [
    {
      "fullName": "John Smith",
      "city": "New York",
      "state": "NY"
    }
  ],
  "sources": [
    "truepeoplesearch",
    "fastpeoplesearch"
  ],
  "maxResultsPerSearch": 10,
  "onlyVerified": false,
  "reuseHours": 24,
  "monitorMode": false
}
```

# Actor output Schema

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

No description

# 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 = {
    "searches": [
        {
            "fullName": "John Smith",
            "city": "New York",
            "state": "NY"
        }
    ],
    "sources": [
        "truepeoplesearch",
        "fastpeoplesearch"
    ],
    "maxResultsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/skip-trace-lookup").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 = {
    "searches": [{
            "fullName": "John Smith",
            "city": "New York",
            "state": "NY",
        }],
    "sources": [
        "truepeoplesearch",
        "fastpeoplesearch",
    ],
    "maxResultsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/skip-trace-lookup").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 '{
  "searches": [
    {
      "fullName": "John Smith",
      "city": "New York",
      "state": "NY"
    }
  ],
  "sources": [
    "truepeoplesearch",
    "fastpeoplesearch"
  ],
  "maxResultsPerSearch": 10
}' |
apify call themineworks/skip-trace-lookup --silent --output-dataset

```

## MCP server setup

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

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/VdFDo1odlQ1zb8Mbu/builds/nAGBY9bazcZWZonUw/openapi.json
