# TruePeopleSearch Scraper — Phone Email Address Lookup (`intelscrape/truepeoplesearch-scraper`) Actor

Reverse phone, name, address, or email people search. Soft CTA → Skip Trace PRO. Opt-in email-verify / phone-liveness / breach-exposure add-ons. Not for FCRA.

- **URL**: https://apify.com/intelscrape/truepeoplesearch-scraper.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** Lead generation, Real estate, Business
- **Stats:** 95 total users, 21 monthly users, 76.4% runs succeeded, 2 bookmarks
- **User rating**: 1.00 out of 5 stars

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Scraper – Phone & Email Matches

![Actor Banner](https://api.apify.com/v2/key-value-stores/PyvJzfQg02FD3RYhd/records/tps-banner.png)

> 🇨🇳 **中文简介 (Chinese — China & Singapore):**
> TruePeopleSearch 公开页里的电话和邮箱，用姓名、地址、电话或邮箱即可查询。默认只输出含电话/邮箱的匹配并按条计费，避免为空页买单；无需 API Key。适合需要美国公开联系方式的中介、催收辅助与 B2B  enrichment 团队（非 FCRA 决策用途）。马上试跑，把匹配结果导出 CSV 或通过 MCP 交给 AI 助手处理。

> 🇸🇬 **Ringkasan Melayu (Singapore):**
> Dapatkan telefon dan e-mel daripada rekod awam TruePeopleSearch menggunakan nama, alamat, telefon atau e-mel. Secara lalai hanya padanan dengan telefon/e-mel ditulis — anda bayar per padanan, bukan halaman kosong. Tiada API key. Sesuai untuk enrichment B2B dan penyelidikan yang sah (bukan keputusan FCRA). Cuba sekarang di Apify Store.

#### 🤖 NEW: Connect This To Your AI!

Want to use IntelScrape actors inside Claude, Cursor, or ChatGPT? Check out the **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)**. Give your AI Model Context Protocol access to people-search and lead agents.

#### 🏆 Featured Bots by IntelScrape

1. **[TruePeopleSearch Scraper](https://apify.com/intelscrape/truepeoplesearch-scraper)** — Phone & Email Matches
2. **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)** — Name, Address, Phone & Email People Lookup
3. **[TikTok Scraper](https://apify.com/intelscrape/tiktok-scraper)** — Emails & Influencer Leads
4. **[Amazon Product Review Scraper](https://apify.com/intelscrape/amazon-product-review-scraper)** — Deep E-commerce & Review Extraction
5. **[Building Permit Scraper](https://apify.com/intelscrape/building-permit-scraper)** — US Cities Open Data
6. **[Google Maps No-Website Leads](https://apify.com/intelscrape/website-Leads)** — Local Businesses Without a Website
7. **[UCC Lien Scraper](https://apify.com/intelscrape/ucc-lien-scraper)** — Florida & New Jersey Filings
8. **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)** — Use Skip Trace inside Claude, Cursor, ChatGPT

#### Soft CTA — next steps after a match&#x20;

Dataset rows now include a `softCta` object with next-step links (no extra PPE):

- **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)** — deeper people enrichment (SoftCTA-only; code frozen)
- **[Google Maps Email Extractor](https://apify.com/intelscrape/google-maps-email-extractor)** — business / seller outreach
- **[Building Permit Scraper](https://apify.com/intelscrape/building-permit-scraper)** — property lead adjacency
- **[UCC Lien Scraper](https://apify.com/intelscrape/ucc-lien-scraper)** — filing / distress signals
- **[Google Maps No-Website Leads](https://apify.com/intelscrape/website-Leads)** — local businesses without a site
- **[Contact Info Scraper](https://apify.com/intelscrape/contact-info-scraper)** — crawl emails from a URL

Optional paid enrichments (`email-verify`, `phone-liveness`, `breach-exposure`) stay on their existing schedule — SoftCTA deepen does not change PPE.

***

⚡ **Use this Actor in n8n — no code**

1. Add the official **Apify** node in n8n.
2. Connect your Apify API token.
3. Run Actor ID: `IntelScrape/truepeoplesearch-scraper`.

***

![price](https://img.shields.io/badge/price-$3.00_/_1K-e83e8c) ![billing](https://img.shields.io/badge/billing-pay_only_for_matches-2ea44f) ![API key](https://img.shields.io/badge/API_key-not_required-blue) ![coverage](https://img.shields.io/badge/coverage-United_States-8a2be2) ![search](https://img.shields.io/badge/search-name_·_address_·_phone_·_email-blue)

**People search focused on contact matches.** Look up by **name, address, phone, or email** and get merged public-record style rows with phones/emails when available.\
**Bulk input, no API key, pay only for matches.**

> **Honest coverage & billing (read this):** Baseline is public-records style lookup + best-effort sources (optional keyed enrichments only if the owner configured them). **By default only rows with a phone and/or email are written** (billed as dataset results). Enable address-only only if the input exposes that flag. Use demo mode for fictional format samples when available.

***

> 🧭 Built for **skip tracers, wholesalers, process servers, debt recovery, and B2B enrichment teams.**

> ⭐ **Store rating is driven by daily power users.** Please [leave a review](https://apify.com/intelscrape/truepeoplesearch-scraper) if this saves you time.

> ⚖️ **Lawful business use only.** Publicly available information only — **not** a consumer reporting agency / **not** for FCRA decisions. You are liable for unlawful use.

> 📌 *Examples are fictional.*

***

### Common names & thin results (honest)

Common-name searches (e.g. `John Smith` without City+ST) often return **0 billed contacts**. When hits exist but none include phone/email, the run can look **FAILED** in the Store (status message like “Found name/address hits but 0 with phone/email (not billed)”) even though billing stayed honest — thin rows are skipped by default so you are not charged for empty contact fields.

**How to get better contact matches:**

1. Scope name searches with **City + ST** (e.g. `"John Smith, Austin, TX"` or `queries`: `"John Smith | Austin, TX"`).
2. Prefer **reverse phone** (`phones[]`) or reverse email when you already have an identifier — highest contact hit rate.
3. Set **`includeAddressOnlyResults: true`** only if you want name/address public-record rows without phone/email (those rows are billed if written).
4. Keep default off if you only want dialable/emailable matches (pay for contacts, not thin pages).

### 🕵️‍♂️ Why Choose Us vs. "Cheaper" Competitors?

| Feature | TruePeopleSearch Scraper | Thin TPS clones |
| :--- | :--- | :--- |
| **Billing** | Pay for contact matches | Pay for empty thin rows |
| **Modes** | Name / address / reverse phone / email | Single brittle mode |
| **Stack** | Aligned with Skip Trace PRO quality bar | One-off scripts |

***

### Quick start

```json
{
  "names": ["John Smith, Springfield, IL"],
  "maxResultsPerQuery": 3
}
```

***

### Pricing (PPE)

| Event | Notes |
| :--- | :--- |
| **result** | Each contact-match item in the default dataset |
| Actor start | Platform start event if enabled |

***

### Legal

Lawful B2B / investigative use of public information only. Not for FCRA consumer decisions.

***

### Match-rate honesty (read before bulk runs)

Common name-only searches (e.g. "John Smith") often find **public-record name/address hits without phone or email**. By default those thin rows are **not written and not billed**. The run may finish with **0 contact matches** — that is expected billing honesty, not a Store outage.

**Tips for billed contacts:** use reverse phone/email, include **City + State** with the name, start with `demoMode` to inspect the schema, or set `includeAddressOnlyResults: true` only if you want property rows without phone/email (those rows are billed if written).

> ⭐ **Store review**
>
> If a live lookup returned the contact fields you needed, a quick Store review helps other users — thank you.

# Actor input Schema

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

Optional Google Sheets / CSV URL for bulk lookups. Headers like Name, Address, Phone, Email.

## `csvFile` (type: `string`):

Optional uploaded CSV with headers like Name, Address, Phone, Email.

## `maxResultsPerQuery` (type: `integer`):

How many matching people to return per search.

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

Global cap across all lookups in this run (axlymxp/jungle-style). Run stops once this many contact matches are written. Default 1000.

## `queries` (type: `array`):

One lookup per line. Name searches can scope location after a pipe: "James Smith | Austin, TX". Phones, emails, or street addresses also work. Prefer this for axlymxp-style bulk lists.

## `ageMin` (type: `integer`):

Keep only matches with age ≥ this value when age is known. Rows without age are dropped when an age filter is set.

## `ageMax` (type: `integer`):

Keep only matches with age ≤ this value when age is known. Rows without age are dropped when an age filter is set.

## `searchState` (type: `string`):

Pick the state for your name searches (used when you don't type a state in the name). Routes the search to that state's records. Leave on Auto to detect from what you type.

## `searchMode` (type: `string`):

Jungle-style single lookup mode. Use with firstName/lastName, phone, or address fields below — or prefer the arrays / searches\[] for bulk. Leave empty when using names\[]/phones\[]/addresses\[].

## `firstName` (type: `string`):

Optional. Used with searchMode=name (or inferred). Prefer names\[] for multiple people.

## `middleName` (type: `string`):

Optional middle name for singular name mode / searches\[] defaults.

## `lastName` (type: `string`):

Optional. Used with searchMode=name (or inferred).

## `city` (type: `string`):

Optional city for singular name or address mode.

## `state` (type: `string`):

Optional US state for singular name/address mode. Overrides searchState for that lookup when set.

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

Optional jungle-style batch. Each object can set searchMode + firstName/lastName/city/state OR phone OR address OR email. Top-level singular fields act as defaults. Prefer this for mixed reverse-phone + name lists in one run.

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

One name per line. Best match rate with City + State, e.g. "Jane Doe, Dallas, TX". Also accepts legacy key `name` (singular).

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

Full street address (e.g. "123 Main St, Austin, TX 78701"). Also accepts legacy key `address`.

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

Reverse phone lookup. Any common US format works. Also accepts legacy key `phone`.

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

Reverse email lookup. Also accepts legacy key `email`.

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

We will HTTP POST the final enriched records to this URL as soon as the run finishes.

## `verifyEmails` (type: `boolean`):

Opt-in. When on, verifies emails (MX or MillionVerifier if configured) and bills **email-verify ($0.002)** once per contact match that includes a verification result. Default off — free path unchanged.

## `classifyPhones` (type: `boolean`):

Validate + normalize to E.164 and classify mobile/landline/voip; surfaces the best number.

## `verifyPhoneLiveness` (type: `boolean`):

Opt-in. When on, checks whether the best phone line looks active (NumVerify when NUMVERIFY\_API\_KEY is set; demoMode uses a fictional result) and bills **phone-liveness ($0.003)** once per match with a liveness result. Default off.

## `checkBreachExposure` (type: `boolean`):

Opt-in. When on, flags whether the best email appears in known breaches (HIBP when HIBP\_API\_KEY is set; demoMode uses a fictional result) and bills **breach-exposure ($0.002)** once per contact match that includes a breach result. Default off — free path unchanged.

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

Returns a clearly labeled FICTIONAL sample record so you can inspect the output schema. Not live people-search data. On Store PPE, writing the sample may bill one dataset-item event.

## `includeAddressOnlyResults` (type: `boolean`):

Default off. When off, name/address hits without a phone or email are omitted and not billed. Turn on only if you want property-owner / public-record rows without contact fields (those are billed if written).

## Actor input object example

```json
{
  "maxResultsPerQuery": 3,
  "maxItems": 1000,
  "queries": [
    "John Smith | Greensboro, NC"
  ],
  "searchState": "",
  "searchMode": "",
  "state": "",
  "searches": [
    {
      "searchMode": "name",
      "firstName": "John",
      "lastName": "Smith",
      "state": "NY"
    },
    {
      "searchMode": "phone",
      "phone": "5167817770"
    }
  ],
  "names": [
    "John Smith, Greensboro, NC"
  ],
  "verifyEmails": false,
  "classifyPhones": true,
  "verifyPhoneLiveness": false,
  "checkBreachExposure": false,
  "demoMode": false,
  "includeAddressOnlyResults": false
}
```

# Actor output Schema

## `fullName` (type: `string`):

The person's full name

## `matchConfidence` (type: `string`):

Confidence score of the match

## `age` (type: `string`):

Person's age

## `currentAddress` (type: `string`):

Most recent address

# 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 = {
    "queries": [
        "John Smith | Greensboro, NC"
    ],
    "searches": [
        {
            "searchMode": "name",
            "firstName": "John",
            "lastName": "Smith",
            "state": "NY"
        },
        {
            "searchMode": "phone",
            "phone": "5167817770"
        }
    ],
    "names": [
        "John Smith, Greensboro, NC"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("intelscrape/truepeoplesearch-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 = {
    "queries": ["John Smith | Greensboro, NC"],
    "searches": [
        {
            "searchMode": "name",
            "firstName": "John",
            "lastName": "Smith",
            "state": "NY",
        },
        {
            "searchMode": "phone",
            "phone": "5167817770",
        },
    ],
    "names": ["John Smith, Greensboro, NC"],
}

# Run the Actor and wait for it to finish
run = client.actor("intelscrape/truepeoplesearch-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 '{
  "queries": [
    "John Smith | Greensboro, NC"
  ],
  "searches": [
    {
      "searchMode": "name",
      "firstName": "John",
      "lastName": "Smith",
      "state": "NY"
    },
    {
      "searchMode": "phone",
      "phone": "5167817770"
    }
  ],
  "names": [
    "John Smith, Greensboro, NC"
  ]
}' |
apify call intelscrape/truepeoplesearch-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,intelscrape/truepeoplesearch-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/EQWGhgaq5ac5tAvYk/builds/ptQnbkNv69cROFRgr/openapi.json
