# TruePeopleSearch — People Search Scraper (`memo23/truepeoplesearch-people-search-scraper`) Actor

Scrape US people from TruePeopleSearch by name, phone or address. Each row: full phone numbers, emails, current + past addresses with geo, relatives, associates, aliases, age and property details (beds, baths, value, year built). Cloudflare handled. Bulk lists, CSV & webhook. JSON or CSV out.

- **URL**: https://apify.com/memo23/truepeoplesearch-people-search-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation
- **Stats:** 11 total users, 7 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 person records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TruePeopleSearch — People Search Scraper

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/logo-truepeoplesearch.png" width="128" alt="TruePeopleSearch scraper logo">
</p>

**Find anyone in the US by name, phone, or address** and get one clean, structured record per person — **full (unmasked) phone numbers**, emails, current and past addresses with geo-coordinates, relatives, associates, aliases, age, and even **property details** (beds, baths, sqft, value, year built). Built for lawful skip tracing, debt recovery, process serving, and B2B contact enrichment.

Powered by **[TruePeopleSearch](https://www.truepeoplesearch.com)** public-records data. The site is protected by Cloudflare — this Actor clears it for you, so the data that a browser struggles to reach comes straight out in your dataset.

#### How it works

![How the TruePeopleSearch scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-truepeoplesearch.png)

#### ✨ Why use this scraper?

- **Full phone numbers.** Every phone on the profile, in the familiar `(NPA) NXX-XXXX` format — no "unlock" wall.
- **Four lookup modes in one Actor.** Search by **name**, **reverse-phone**, **reverse-address**, or **email** — mix them in a single run.
- **Whole-person records.** Each row carries name + name parts, aliases, age + birth month, every phone and email, current + past addresses (with latitude/longitude), relatives, and associates — each relative/associate with their own profile URL.
- **Property intelligence.** Where TruePeopleSearch publishes it, the current-address property is parsed into structured fields: bedrooms, bathrooms, square feet, ownership (owner/renter), estimated value, equity, year built, and HOA.
- **Cloudflare handled.** The site sits behind Cloudflare; the Actor escalates to an unblocker automatically so you don't manage fingerprints or captchas.
- **Bulk-ready.** Drop in a list of names, phones, or addresses (or a CSV URL) and get one row per matched person, billed per record.
- **CSV + CRM built in.** Feed a CSV URL of lookups, POST each result straight to Zapier / Make / GoHighLevel, flatten to `Email-1` / `Phone-1` columns, or preview the exact output for free with demo mode.
- **Resume cursor.** Paste `resumeCursor` from a capped run to continue without re-billing people you already received.

#### 🎯 Use cases

| You are a… | Use it to… |
|---|---|
| Skip tracer / collections agency | Locate debtors and account holders — current address + every known phone |
| Real-estate investor / wholesaler | Find the owner behind a property address and reach them directly |
| Process server | Confirm a current address for lawful service |
| Private investigator | Build a contact + associates picture from a single identifier |
| B2B data / lead-gen team | Append phone numbers and address history to your contact lists |
| Fraud / due-diligence analyst | Verify identity, address history, and known relatives |

#### 📥 Supported inputs

| Input | Example | Returns |
|---|---|---|
| **Name** | `John Smith, Irving, TX` | People matching the name (optional city/state/ZIP narrows it) |
| **Phone** (reverse) | `(972) 917-9873` | The likely owner of the number + their record |
| **Address** (reverse) | `935 Turtle Cv, Irving, TX 75060` | People associated with the address |
| **Email** (reverse) | `jane@example.com` | People tied to that email |
| **Direct URL** | `https://www.truepeoplesearch.com/find/person/p4246290nl4r29r2l8n6` | A profile URL scraped verbatim; search URLs also supported |

**Not supported:** non-US records, and any content behind a TruePeopleSearch login. This Actor reads only public pages.

#### Coming from another skip-trace actor?

| Complaint we keep seeing on the category leader | What this actor does |
|---|---|
| Charged for “Person Not Found” / 404s | Billing is `apify-default-dataset-item` — a row has to land in the dataset |
| One name per run | Pass `names[]` / `phones[]` / `emails[]` — one run, many lookups |
| Detail page 502s, empty dataset | Listing-card fallback still writes the name, age, city, and relatives |
| Re-paying for page 1 of a huge name search | Paste `resumeCursor` from the previous run |

#### 🔄 How it works

1. Each name / phone / address query is turned into a TruePeopleSearch **search URL** (`/results`, `/resultphone`, `/resultaddress`).
2. The search page is fetched (Cloudflare cleared) and every matched person's **profile link** is collected; result pages are paginated with `?page=N`.
3. Each `/find/person/{id}` **profile page** is fetched in parallel (sliding-window concurrency, capped at `maxItems`).
4. The profile's JSON-LD is parsed for name, aliases, full phones, emails, current address + geo, relatives and associates; past addresses and property details are read from the page.
5. **One row per person** is pushed to the dataset (and optionally POSTed to your webhook).

#### ⚙️ Input parameters

| Field | Type | Description |
|---|---|---|
| `names` | array | Full names to look up. Append a location after a comma to narrow, e.g. `"Jane Doe, Irving, TX"` or `"John Smith, 75060"`. |
| `phones` | array | US phone numbers in any format — `(972) 917-9873`, `972-917-9873`, `+1 972 917 9873`. |
| `addresses` | array | Street addresses with city/state/ZIP, e.g. `"935 Turtle Cv, Irving, TX 75060"`. |
| `emails` | array | Email addresses for reverse lookup, e.g. `"jane@example.com"`. |
| `flattenedOutput` | boolean | Add `Email-1` / `Phone-1` / `Person Link` columns for Sheets / CRM exports. |
| `resumeCursor` | string | Continue a previous run without re-billing delivered people. |
| `maxItemsPerSearch` | integer | Cap per lookup. Defaults to 5 when you pass more than one search. |
| `startUrls` | array | Advanced: direct truepeoplesearch.com URLs — search pages or `/find/person/{id}` profile pages. |
| `csvUrl` | string | Link to a raw CSV whose header names Name / Phone / Address columns. Each row's cells become lookups. |
| `webhookUrl` | string | Each person record is POSTed here as JSON as it's found. Best-effort; a failed webhook never fails the run. |
| `demoMode` | boolean | Return a single sample record with no lookup and no charge, to preview the output shape. |
| `maxItems` | integer | Hard cap on person records pushed across all lookups. Default `100`. You are billed per record. |
| `maxConcurrency` | integer | How many profile pages to fetch in parallel. Default `8`. |

#### 📊 Output overview

The dataset holds **one row per matched person**. Multi-value fields (phones, emails, past addresses, relatives, associates, aliases) are arrays; `age`, `property.*` numeric fields, and geo-coordinates are typed numbers; `scrapedAt` is an ISO-8601 timestamp. No padding rows — you pay only for real person records.

#### 📦 Output sample

```json
{
  "type": "person",
  "personId": "p4246290nl4r29r2l8n6",
  "fullName": "Johnny Smith",
  "givenName": "Johnny",
  "familyName": "Smith",
  "aliases": ["Johnny Dale Smith", "John Dale Smith", "Dale Smith", "James Smith"],
  "age": 34,
  "bornMonthYear": "October 1991",
  "phones": ["(972) 917-9873", "(817) 793-3808", "(817) 231-2999"],
  "emails": ["smithiiijohnny899@gmail.com", "johnny-smith_@sbcglobal.net"],
  "currentAddress": {
    "streetAddress": "935 Turtle Cv",
    "addressLocality": "Irving",
    "addressRegion": "TX",
    "postalCode": "75060",
    "addressCountry": "US",
    "latitude": 32.791108,
    "longitude": -96.958301,
    "url": "https://www.truepeoplesearch.com/find/address/935-turtle-cv_irving-tx-75060"
  },
  "pastAddresses": [
    {
      "streetAddress": "1223 E San Miguel St #3",
      "addressLocality": "Colorado Springs",
      "addressRegion": "CO",
      "postalCode": "80909",
      "addressCountry": "US",
      "latitude": null,
      "longitude": null,
      "url": "https://www.truepeoplesearch.com/find/address/1223-e-san-miguel-st-3_colorado-springs-co-80909"
    }
  ],
  "addressCount": 10,
  "relatives": [
    { "name": "Brian Christopher Smith", "profileUrl": "https://www.truepeoplesearch.com/find/person/p848982ur44n998lll0r" }
  ],
  "associates": [
    { "name": "Jessa A Lynas", "profileUrl": "https://www.truepeoplesearch.com/find/person/pln26l8l89lr2608unun" }
  ],
  "property": {
    "bedrooms": 2,
    "bathrooms": 1.5,
    "squareFeet": 880,
    "ownership": "owner",
    "estimatedValueUsd": 156000,
    "equityUsd": 156000,
    "equityPercent": 100,
    "yearBuilt": 1982,
    "hoaMonthlyUsd": 485
  },
  "description": "Born in October 1991, Johnny Smith is 34 years old. He has resided at 935 Turtle Cv in Irving, TX…",
  "profileUrl": "https://www.truepeoplesearch.com/find/person/p4246290nl4r29r2l8n6",
  "source": "truepeoplesearch",
  "scrapedAt": "2026-07-22T21:14:08.690Z"
}
```

#### 🗂 Key output fields

| Field | Type | Notes |
|---|---|---|
| `personId` | string | TruePeopleSearch profile id (from `/find/person/{id}`). |
| `fullName`, `givenName`, `familyName` | string | Name and its parts. |
| `aliases` | string\[] | "Also seen as" names. |
| `age` | integer | null | Current age. |
| `bornMonthYear` | string | null | Birth month + year (day not published). |
| `phones` | string\[] | All phone numbers on the profile, unmasked. |
| `emails` | string\[] | All email addresses on the profile. |
| `currentAddress` | object | null | Current address with `latitude`/`longitude`. |
| `pastAddresses` | object\[] | Previous addresses (geo not always available). |
| `addressCount` | integer | Current + past address count. |
| `relatives` | object\[] | Likely relatives — each `{ name, profileUrl }`. |
| `associates` | object\[] | Likely associates — each `{ name, profileUrl }`. |
| `property` | object | null | *Site-specific bonus:* beds, baths, sqft, ownership, value, equity, year built, HOA (when TruePeopleSearch publishes it). |
| `description` | string | null | The profile's prose summary. |
| `profileUrl` | string | Canonical profile URL. |
| `source` | string | Always `"truepeoplesearch"`. |
| `scrapedAt` | string | ISO-8601 scrape timestamp. |

#### Pricing

| Event | When | Price |
|---|---|---|
| Actor start | Once per run, per GB of memory | $0.005 |
| Person record | Each row pushed to the dataset | $0.003 |

Demo mode returns one sample row and is not billed as a live lookup. Removed or 404 profiles are skipped and not billed.

#### ❓ FAQ

**Does TruePeopleSearch block scrapers?**
Yes — it runs behind Cloudflare. This Actor tries a fast direct fetch first and automatically escalates to an unblocker that clears the challenge, so you don't manage proxies, fingerprints, or captchas. Expect a few seconds per profile page.

**Are the phone numbers really unmasked?**
Yes. Every phone published on the profile is returned in full, in `(NPA) NXX-XXXX` format.

**Can I search without a location?**
For names, the location (city, state, or ZIP after a comma) is optional but recommended — a bare common name returns many matches and burns more of your `maxItems`. Phone and address lookups are already specific.

**Why did some lookups return fewer rows than `maxItems`?**
Common names in large states have many matches; uncommon names may return few or none. Profiles that 404 (removed or moved) are skipped and not billed.

**Is the data free to use commercially?**
TruePeopleSearch aggregates public records. You are responsible for complying with its Terms of Service and applicable law (FCRA, CCPA, GDPR) — see the Disclaimer. This data must not be used for FCRA-regulated decisions (credit, employment, housing, insurance).

#### 💬 Support

Found a layout change or a field that stopped populating? Open an issue at https://console.apify.com/actors/VmfhYQ9tW4ijMWpuN/issues with the input you used and we'll fix it.

#### 🛠 Additional services

Need a custom people-search or skip-tracing pipeline, CRM integration, or a different data source? Reach out — bespoke scrapers and enrichment flows are available.

#### 🔎 Explore more scrapers

- [**FastPeopleSearch Scraper**](https://apify.com/memo23/fastpeoplesearch-scraper) — same pipeline on FastPeopleSearch.com (phones with carrier, decoded emails)

### 🤖 For AI Agents & LLM Apps

Purpose: look up a US person on TruePeopleSearch and return phones, emails, addresses, relatives, associates and property details.

Minimal input:

```json
{ "names": ["John Smith, Irving, TX"], "maxItems": 5 }
```

Also accepts `phones[]`, `addresses[]`, `emails[]`, or `startUrls[]` (search or `/find/person/{id}` pages). Set `flattenedOutput: true` for CRM columns.

Output: one dataset row per person. Flat fields: `fullName`, `age`, `phones[]`, `emails[]`, `currentAddress`, `pastAddresses[]`, `relatives[]`, `associates[]`, `property`, `profileUrl`. Billed $0.003 per row plus $0.005 start. Set `demoMode: true` for a free sample row with no live fetch.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by TruePeopleSearch, its parent company, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available people-search pages — no authenticated endpoints, member-only features, or content behind a TruePeopleSearch login. Data returned by this Actor originates from public records aggregated by TruePeopleSearch and may be inaccurate or out of date. It must **not** be used for any purpose regulated by the Fair Credit Reporting Act (FCRA) — including decisions about credit, employment, insurance, tenant screening, or eligibility for a benefit. Users are solely responsible for ensuring their use complies with TruePeopleSearch's Terms of Service, applicable data-protection and privacy law (FCRA, CCPA, GDPR, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

truepeoplesearch scraper, scrape truepeoplesearch, truepeoplesearch api, true people search scraper, people search scraper, reverse phone lookup scraper, reverse address lookup, skip tracing tool, skip trace api, people finder api, us people search, public records scraper, contact enrichment scraper, phone number scraper, address history lookup, relatives and associates lookup, lead generation people data, apify truepeoplesearch, debtor location tool, process server address lookup

# Actor input Schema

## `names` (type: `array`):

Full names to look up. Optionally append a location after a comma to narrow results, e.g. "Jane Doe, Irving, TX" or "John Smith, 75060".

## `phones` (type: `array`):

US phone numbers in any format — "(972) 917-9873", "972-917-9873", "+1 972 917 9873". Returns the likely owner and their full record.

## `addresses` (type: `array`):

Street addresses with city, state and ZIP, e.g. "935 Turtle Cv, Irving, TX 75060". Returns the people associated with the address.

## `emails` (type: `array`):

Email addresses to look up on TruePeopleSearch, e.g. "jane@example.com". Empty lookups are not billed.

## `flattenedOutput` (type: `boolean`):

When enabled, each row also gets CRM-style columns (`Email-1`…`Email-5`, `Phone-1`, `Street Address`, `Input Given`, `Person Link`) so a CSV export drops into Sheets the same way skip-trace tools do. Nested arrays stay on the row.

## `resumeCursor` (type: `string`):

Paste the cursor from a previous run (logged as RESUME\_CURSOR and saved in the key-value store) to continue without fetching or billing people you already received. Leave empty for a fresh crawl.

## `maxItemsPerSearch` (type: `integer`):

Cap on person records kept for each name / phone / address / email. Default is 5 when you pass more than one lookup, otherwise the global Maximum person records applies.

## `startUrls` (type: `array`):

Direct truepeoplesearch.com URLs to scrape as-is.

## `csvUrl` (type: `string`):

Link to a raw CSV whose header names Name / Phone / Address columns (City/State/Zip fold into the name). Each row's cells become lookups.

## `webhookUrl` (type: `string`):

Each person record is HTTP POSTed here as JSON as soon as it's found. Best-effort; a failed webhook never fails the run.

## `demoMode` (type: `boolean`):

Return a single sample record so you can see the exact output format without running a lookup or being charged.

## `maxItems` (type: `integer`):

Hard cap on the number of person records pushed to the dataset across all lookups. You are billed per record.

## `maxConcurrency` (type: `integer`):

How many profile pages to fetch in parallel.

## Actor input object example

```json
{
  "names": [
    "John Smith, Irving, TX"
  ],
  "flattenedOutput": false,
  "demoMode": false,
  "maxItems": 10,
  "maxConcurrency": 8
}
```

# Actor output Schema

## `people` (type: `string`):

One row per person: name, phones, emails, current and past addresses, relatives, associates and property details.

# 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 = {
    "names": [
        "John Smith, Irving, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/truepeoplesearch-people-search-scraper").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 = { "names": ["John Smith, Irving, TX"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/truepeoplesearch-people-search-scraper").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 '{
  "names": [
    "John Smith, Irving, TX"
  ]
}' |
apify call memo23/truepeoplesearch-people-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/truepeoplesearch-people-search-scraper"
        }
    }
}
```

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/VmfhYQ9tW4ijMWpuN/builds/zlQAtgzIMp8GYRzQg/openapi.json
