# TruePeopleSearch Scraper — People Search & Reverse Phone Lookup (`intelscrape/truepeoplesearch-scraper`) Actor

TruePeopleSearch scraper for people search by name, phone, address or email: phones, emails, ages, current and past addresses and relatives. Reverse phone lookup for skip tracing and CRM enrichment. Pay per match. Not for FCRA use.

- **URL**: https://apify.com/intelscrape/truepeoplesearch-scraper.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** Lead generation, Real estate, Business
- **Features:** Limited permissions
- **Stats:** 376 total users, 63 monthly users, 97.1% runs succeeded, 3 bookmarks
- **User rating**: 1.47 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?

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

## TruePeopleSearch Scraper – Phone & Email Matches

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

> ⭐ **Honest review welcome:** if you've run this Actor, please [leave an honest review on the Actor page](https://apify.com/intelscrape/truepeoplesearch-scraper/reviews) (good or bad). Something not working? Please [open an issue](https://apify.com/intelscrape/truepeoplesearch-scraper/issues/open) and we'll look at it. We don't pay or reward anyone for reviews.

> 🇨🇳 **中文简介 (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

#### Next steps after a match

Each row includes a `softCta` object with links to related lookups (no extra charge):

- **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)** — deeper people enrichment
- **[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 — these links do not change pricing.

***

⚡ **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.**

> ⚠️ **Zero-row warning (data-source keys):** this Actor ships with free sources only (North Carolina property records, ThatsThem, FEC donors). **No paid data-source key (PDL / ScraperAPI / Endato) is configured**, and ThatsThem now masks many phone digits and email characters. So **name searches outside North Carolina often return 0 rows**, and the run status message will say so. Best results: search by **phone or email (reverse lookup)**, or use `Name, City, ST` (NC works best). Zero-row runs are not charged for results; only the one-time Actor start event applies. This is a data-source limit, not a crash.

> **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 (saved to Key-value store `OUTPUT`, no result charge; the start event still applies).

***

> 🧭 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.*

***

### 🔗 Permit → Owner → Contact: a 3-step lead pipeline (for roofing, solar, HVAC & real-estate sales teams)

Three IntelScrape Actors chain into one workflow: find who just pulled a permit, then find a way to reach them. Each step is its own pay-per-event run, so you only pay for the steps you use.

| Step | Actor | What it gives you |
| :--- | :--- | :--- |
| [Building Permit Scraper](https://apify.com/intelscrape/building-permit-scraper) | 1. New permits by city, trade and value: address, contractor, owner name where the city publishes it |
| [Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro) | 2. Turn a name or address from step 1 into a person record (address history, relatives, phone/email where available) |
| **TruePeopleSearch Scraper** (you are here) | 3. Second-source phone/email check for the same person, so you can compare two sources before you call |

**How to run it (no code):**

1. Run Building Permit Scraper with e.g. `{"city":"Austin","permitType":"Roofing","timePeriod":"Last 30 days","maxResults":25,"enrichContractors":false}` and export the dataset.
2. Feed the owner names and addresses into Skip Trace PRO, one `First Last, City ST` query per line.
3. Send any person who still has no phone or email to TruePeopleSearch Scraper.
4. Keep the rows that two sources agree on; those are your call list.

Apify integrations (n8n, Make, Zapier, Google Sheets) can pass the dataset from one step to the next with no code. Results depend on what each public source returns for a given person; rows with no phone or email are not guaranteed.

### 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
}
```

***

### New in 1.0.60: CRM-ready columns and mobile-only filter&#x20;

Two free options (no extra charge) make the export drop straight into a CRM, dialer or spreadsheet:

- **`flattenedOutput: true`** adds flat columns to every row: `Phone-1`…`Phone-5` with `Phone-N Type` (Wireless / Landline / VoIP), `Email-1`…`Email-5`, `Full Name`, `Age`, `Street Address`, `Input Given` and `Person Link`.
- **`wirelessOnly: true`** keeps only mobile numbers (in `phones`, `bestPhone` and the `Phone-N` columns), which is handy for SMS and dialer campaigns. A match left with no phone and no email is skipped and not billed.
- **Fixed:** email columns in the default table / CSV view were blank before 1.0.60. They now fill, and the view adds `bestPhone`, `bestPhoneType` and `bestEmail`.

```json
{
  "phones": ["(415) 555-0100"],
  "flattenedOutput": true,
  "wirelessOnly": true
}
```

Example flat row (fictional demo record, from `demoMode`):

| Full Name | Age | Phone-1 | Phone-1 Type | Email-1 | Street Address |
| :--- | :--- | :--- | :--- | :--- | :--- |
| Jordan A Sample | 42 | (415) 555-0100 | Wireless | jordan.sample@example.com | 500 Example Ave, New York, NY 10118 |

***

### Pricing (pay per event)

You pay only for what is delivered. Apify platform usage for the run is billed to your account as normal.

| Event | Price | When it is charged |
| :--- | :--- | :--- |
| **Contact match (result)** | **$0.003** ($3.00 per 1,000) | Each row written with a phone and/or email. Thin rows without contacts are skipped and not billed. |
| Email verification | $0.002 | Once per match that includes a verification result. **On by default** (`verifyEmails`). Set `verifyEmails: false` to skip it. |
| Phone liveness check | $0.003 | Opt-in only (`verifyPhoneLiveness: true`), once per match with a liveness result. |
| Actor start | $0.0005 per run (rises to $0.005 per GB of memory from Oct 28, 2026) | Once when the run starts. |

**What 1,000 matches cost:** about **$3.00** with `verifyEmails: false`, or up to **$5.00** with the default email verification on. Use `maxItems` to cap spend per run.

***

### Use cases

- **Skip tracing and wholesaling:** find a phone or email for a property owner from a name plus city/state or a mailing address.
- **Reverse phone or email lookup:** put a name and address to an inbound number or address you already have.
- **CRM and dialer enrichment:** turn on `flattenedOutput` and `wirelessOnly` to get mobile numbers in `Phone-1`…`Phone-5` columns ready for import.
- **Bulk lists:** paste a Google Sheets or CSV link in `csvUrl` (headers like Name, Address, Phone, Email) and export results to CSV, Excel or JSON.
- **Automations:** call it from n8n, Make, Zapier or the Apify API, or set `webhookUrl` to receive the records when the run finishes.

***

### ⏰ Schedule this Actor — monthly refresh of a contact list kept in a Google Sheet

Run it once with your own settings, save that run as a **task**, then let Apify Schedules repeat it. About two minutes, no code.

1. In Apify Console open **Schedules** → **Create new**.
2. Click **Add** → pick your saved task (or this Actor), set the cron expression and time zone below, and click **Enable** (new schedules start disabled).
3. Optional: open the task's integrations and add a **webhook** on `ACTOR.RUN.SUCCEEDED` so every finished run is pushed to your CRM, Zapier, Make or n8n. Payload template: `{"runId": {{resource.id}}, "datasetId": {{resource.defaultDatasetId}}, "status": {{resource.status}}}`. Your tool then reads `https://api.apify.com/v2/datasets/<datasetId>/items?format=csv`, or use the Apify integrations for Google Sheets, Make and Zapier.

| Cadence | Cron expression |
| :--- | :--- |
| Every day, 8 AM | `0 8 * * *` |
| Weekdays, 8 AM | `0 8 * * 1-5` |
| Every Monday, 8 AM | `0 8 * * 1` |
| 1st of the month, 8 AM | `0 8 1 * *` |

**Starter task input for this Actor** (edit the values, then paste into the task):

```json
{
  "csvUrl": "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/export?format=csv",
  "maxItems": 200,
  "flattenedOutput": true,
  "webhookUrl": "https://your-crm.example.com/hooks/tps"
}
```

- Keep your lookup list (Name, Address, Phone, Email columns) in one sheet. Edit the sheet, not the task, and every scheduled run picks up the new rows.
- `maxItems` is a hard cap on matches written per run, so a scheduled run cannot exceed the budget you choose.
- There is no change-only mode yet: every scheduled run searches the whole list again and each contact match is billed again. Schedule monthly or weekly for lists you want refreshed, and remove finished rows from the sheet.

**Prefer the API?** `POST https://api.apify.com/v2/schedules` with a body like the one below (send your token in the `Authorization: Bearer` header):

```json
{
  "name": "truepeoplesearch-scraper-weekly",
  "userId": "YOUR_USER_ID",
  "actions": [
    {
      "type": "RUN_ACTOR_TASK",
      "actorTaskId": "YOUR_TASK_ID"
    }
  ],
  "cronExpression": "0 8 1 * *",
  "timezone": "America/New_York",
  "isEnabled": true
}
```

Docs: [Apify Schedules](https://docs.apify.com/platform/schedules) · [Webhook actions](https://docs.apify.com/platform/integrations/webhooks/actions)

> **Did this run save you time?** A quick rating on the Store page helps other people find it. If something broke, open an Issue instead and I'll fix it fast; issues get answered within a day.

### FAQ

**Why did my run return 0 results?** Common names without City + ST often have no phone or email on file. Those rows are skipped and you are not charged for them. Add City + ST, or search by phone or email instead.

**Why does the Store show some runs as FAILED?** A run that found name/address hits but no contact fields can end with a "0 with phone/email (not billed)" status. Nothing is charged for those hits.

**Do I need an API key or proxy?** You do not need to supply one, but coverage depends on the sources configured. This Actor currently runs on free sources only (no PDL / ScraperAPI / Endato key set), so name searches outside North Carolina often return 0 rows; reverse phone/email lookups work best. The run status message states when 0 rows is caused by missing data-source keys.

**Can I try it without spending on real lookups?** Yes. Set `demoMode: true` to see the exact output format using fictional records. The sample is saved to the run's Key-value store (`OUTPUT`); nothing is written to the dataset and no result or add-on events are charged (only the one-time Actor start event applies).

**How do I keep only mobile numbers?** Set `wirelessOnly: true`. Matches left with no phone and no email are skipped and not billed.

**Can I use it for tenant screening, employment or credit decisions?** No. It is not a consumer reporting agency and the data is not for FCRA purposes.

***

### 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`):

On by default. Verifies emails with a keyless DNS MX check (or MillionVerifier if configured) and bills email-verify ($0.002) once per contact match that includes a verification result. Turn off to skip.

## `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 is never billed) 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 is never billed) and bills **breach-exposure ($0.002)** once per contact match that includes a breach result. Default off — free path unchanged.

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

Saves a clearly labeled FICTIONAL sample record to the Key-value store (OUTPUT) so you can inspect the output schema. Not live people-search data. Nothing is written to the dataset and no result, email-verify, phone-liveness or breach-exposure events are charged; the one-time Actor start event still applies.

## `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).

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

Free. Adds CRM-style columns to each row: Phone-1…Phone-5 with Phone-N Type (Wireless / Landline / VoIP), Email-1…Email-5, Full Name, Age, Street Address, Input Given and Person Link, so a CSV export drops straight into Google Sheets, a dialer or a CRM. Nested fields stay on the row. No extra charge.

## `wirelessOnly` (type: `boolean`):

Free. Keeps only numbers classified as mobile/wireless in phones, bestPhone and the Phone-N columns — handy for SMS and dialer campaigns. Landline and VoIP numbers are dropped. A match left with no phone and no email is skipped and not billed.

## 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": true,
  "classifyPhones": true,
  "verifyPhoneLiveness": false,
  "checkBreachExposure": false,
  "demoMode": false,
  "includeAddressOnlyResults": false,
  "flattenedOutput": false,
  "wirelessOnly": 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"
    ],
    "verifyEmails": true
};

// 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"],
    "verifyEmails": True,
}

# 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"
  ],
  "verifyEmails": true
}' |
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/0QhoAWx9p8Ryo0z3z/openapi.json
