# Skip Trace & People Search — Phone, Email & Address Lookup (`logical_vivacity/skip-trace-people-search`) Actor

Find the person behind a name, phone number or street address. Returns current and past addresses, mobile and landline numbers with line type and carrier, emails, aliases, age and relatives — each with a 0-100 match score. Pay only for records that carry real contact data.

- **URL**: https://apify.com/logical\_vivacity/skip-trace-people-search.md
- **Developed by:** [Logical Vivacity](https://apify.com/logical_vivacity) (community)
- **Categories:** Lead generation, Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 person founds

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

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 & People Search — Phone, Email & Address Lookup

**A cold trail in, a live contact out.**

You have a name on a deed, a number with no owner, or an address and nothing else. Skip Trace follows it to the person: where they live now and lived before, the mobile that was active last month, the landline that wasn't, their email addresses, the names they also go by, and who they're related to.

Every record comes with a 0-100 match score, so you can tell the difference between *this is them* and *this might be them* — and act accordingly.

You pay for people found, not for searches run.

***

### Try it in 30 seconds

Paste this into **Searches**, tick the terms box, and hit Start:

```
John Smith, Maple Valley, WA
(425) 281-1646
1600 Main St, Dallas, TX
```

Three search types, one input box. That's the whole learning curve.

***

### What you can search

| You have | You type | You get back |
|---|---|---|
| **A name** | `John Smith, Dallas, TX` | The best-matching person, with a match score |
| **A phone number** | `(214) 555-0100` | Who owns the number now (and who had it before, if you want) |
| **A street address** | `1600 Main St, Dallas, TX` | The owner and current residents |

City and state are optional on names, but they make matches far more accurate on common names.

### What every record contains

```jsonc
{
  "input": "John Smith, Maple Valley, WA",
  "searchType": "name",
  "matchScore": 95,                    // 0-100: how sure we are this is your person
  "fullName": "John Louis Smith",
  "firstName": "John", "middleName": "Louis", "lastName": "Smith",
  "age": 63,
  "bornAround": "September 1963",
  "aliases": ["Jim L Smith", "John L Smith", "John Smith JR"],

  "primaryMobile": "(813) 731-6626",   // the number to actually call
  "primaryPhone":  "(813) 754-4953",
  "phones": [
    { "number": "(813) 731-6626", "e164": "+18137316626", "type": "Wireless",
      "carrier": "Verizon Wireless", "lastSeen": "Aug 2026", "isCurrent": true,
      "confirmedBySources": 2 }
  ],

  "primaryEmail": "jhnl@flash.net",
  "emails": ["jhnl@flash.net", "fortyber@hitmail.com"],

  "currentAddress": { "street": "22604 SE 284th Ct", "city": "Maple Valley",
                      "state": "WA", "zip": "98038",
                      "full": "22604 SE 284th Ct, Maple Valley, WA 98038" },
  "pastAddresses": [ /* with the years each was reported */ ],

  "relatives": ["Nicole Winegeart", "Cheryl Smith"],
  "phoneCount": 7, "emailCount": 3,
  "status": "found", "scrapedAt": "2026-09-17T18:04:11Z"
}
```

Export as JSON, CSV, Excel, XML or HTML, or pull it straight from the API.

***

### Who uses this

**Real estate investors & wholesalers** — turn a list of distressed or absentee-owner addresses into owners with live mobile numbers. Feed it the address, get the person.

**Debt collection & recovery** — locate account holders who have moved, with current addresses and phone numbers that show when each was last reported.

**Process servers & legal support** — find a current address for service, plus relatives and past addresses when the trail goes cold.

**Sales & lead generation** — append mobile numbers and emails to a list of names so your outreach actually connects.

**Fraud & identity checks** — confirm that a name, phone and address really belong together before you ship, lend or onboard.

**Reconnecting people** — genealogy, alumni outreach, unclaimed property, lost policy holders.

***

### What makes it different

**One trail, three ways in.** Name → contact, phone → person, address → resident. Most tools do one and charge you separately for each.

**You don't pay for empty results.** A record is only billed when it carries an actual phone, email or address. Blanks and near-misses are free.

**Match scores you can filter on.** Every name search returns a 0-100 confidence figure and the aliases we matched on, so you can auto-accept above 90 and review the rest — instead of guessing whether you got the right John Smith.

**Phone numbers with context.** Line type (mobile vs landline), carrier, and when the number was last reported active. Call the mobile that was seen last month, not the landline from 2012.

**Built to keep working.** Skip Trace draws on several independent data sources and switches between them automatically, so a single source having a bad day doesn't turn into a failed run for you.

**Cross-check mode.** Turn on *Cross-check every person against a second source* and we run two sources and merge them, flagging the phone numbers both agree on (`confirmedBySources: 2`). Use it for high-value lists where a wrong number is expensive.

***

### Settings

| Setting | What it does |
|---|---|
| **Searches** | Your lookups, one per line: names, phones, or addresses |
| **Structured searches** | The same thing as JSON for bulk runs and integrations (`firstName`, `lastName`, `city`, `state`, `street`, `zip`, `phone`, `minAge`, `maxAge`) |
| **People per search** | How many people to return per search. 1 = best match only, the cheapest setting |
| **Match confidence** | Broad / Balanced / Strict. Strict returns only near-certain matches |
| **Cross-check against a second source** | Higher accuracy, higher cost |
| **Include relatives and associates** | Adds likely relatives to each record |
| **Phone lookups: include previous owners** | Also return earlier owners of a phone number |

Everything else — connection handling, retries, source selection, pacing — is managed for you. There is nothing to tune and no proxy to configure.

***

### Bulk lists and automation

Drop thousands of rows into **Structured searches**, or call the Actor from the API:

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~skip-trace-people-search/runs?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
        "people": [
          {"firstName": "John", "lastName": "Smith", "city": "Dallas", "state": "TX"},
          {"phone": "2145550100"},
          {"street": "1600 Main St", "city": "Dallas", "state": "TX"}
        ],
        "maxResultsPerSearch": 1,
        "acceptTerms": true
      }'
```

Works with Make, Zapier, n8n, Google Sheets and the Apify API, and as an MCP tool for AI agents. Schedule it to re-check a list on any cadence.

### Results you can trust

Every run reports what happened per input, so nothing fails silently:

| `status` | Meaning |
|---|---|
| `found` | A person was located and billed |
| `not_found` | Searched successfully, no record matched — not billed |
| `invalid_input` | We couldn't read that line; the message explains how to fix it |
| `error` | Sources were briefly unavailable — retry that input; not billed |

***

### Pricing

**Pay per person found.** You are charged only for records that include real contact data. Not-found, invalid and error rows cost nothing.

Set a maximum charge per run in the Actor's settings to cap spend on large lists; the run stops cleanly at the limit.

***

### FAQ

**Where does the data come from?**
Publicly available US records and public directory listings, aggregated and cross-checked. We don't require you to bring any API keys or accounts.

**How fresh is it?**
Each phone number and address carries the date it was last reported, so you can judge freshness per field rather than trusting a single "updated" stamp.

**Why did a search return no results?**
Common reasons: the person is young or has a thin public record, the name spelling differs from public records, or the location is wrong. Try widening — drop the city, or set Match confidence to Broad.

**Can I search a whole city or pull every record in a ZIP code?**
No. This Actor answers lookups about specific people, numbers and addresses. It is not a bulk database export.

**Is international coverage available?**
US only today.

**Does it work for skip tracing property owners?**
Yes — that's the address search. Give it the property address and you get the owner and residents with contact data.

***

### Terms of Use

By running Skip Trace (ticking **I accept the Terms of Use**) you agree to the following.

**1. Permitted use.** You may use the results only for a lawful purpose that you have determined is permitted in your jurisdiction — for example locating a person in connection with a legitimate business, legal, investigative, debt-recovery, fraud-prevention or reconnection purpose.

**2. FCRA — prohibited uses.** Skip Trace is **not** a consumer reporting agency and its output is **not** a consumer report under the US Fair Credit Reporting Act. You may **not** use the results, in whole or in part, to make decisions about consumer credit, insurance, employment, tenant or housing screening, government benefits, or any other purpose regulated by the FCRA or a comparable law.

**3. Other prohibited uses.** You may not use the results to stalk, harass, threaten, dox, intimidate or discriminate against any person; for unlawful marketing (including calls or texts that violate the TCPA, do-not-call rules or similar laws); or for any purpose prohibited by applicable law.

**4. Your responsibility as data controller.** You are solely responsible for how you collect, store, use, share and delete the results, and for complying with all applicable privacy, data-protection, marketing and consumer-protection laws in your jurisdiction, including responding to any opt-out, access or deletion request you receive from a data subject.

**5. No warranty of accuracy.** Records are aggregated from third-party public sources and may be incomplete, outdated or wrong. Match scores are estimates, not guarantees of identity. Verify independently before you act on a result, especially before contacting anyone or taking a decision that affects them.

**6. No relationship with the sources.** This Actor is not affiliated with, endorsed by, or sponsored by any third-party data source or brand.

**7. Liability.** The Actor is provided "as is", without warranties of any kind. To the maximum extent permitted by law, the developer is not liable for any loss or damage arising from your use of the results, and you agree to indemnify the developer against claims arising from your use.

**8. Removal requests.** If you are an individual and want your information removed, contact the underlying public-records sources directly; records are not stored by this Actor after your run completes.

If you do not agree to these terms, do not run Skip Trace.

***

*Found a case Skip Trace couldn't crack, or need volume pricing?* Open an issue on the Actor's Issues tab — real dead ends are how the matching gets better.

# Actor input Schema

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

One search per line. Any of:
• Name + location — John Smith, Dallas, TX
• Phone number — (214) 555-0100
• Street address — 1600 Main St, Dallas, TX

## `people` (type: `array`):

For bulk runs and integrations. Each item accepts: name (or firstName / middleName / lastName), city, state, street, zip, phone, minAge, maxAge.

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

How many people to return for each search. 1 returns only the best match and costs the least. Raise it when one address or a common name may cover several people.

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

How sure we must be before returning (and charging for) a person on name searches.

## `crossVerify` (type: `boolean`):

Slower and costs more, but merges data from two independent sources and flags the phone numbers both agree on. Worth it for high-value lists and dispute-sensitive work.

## `includeRelatives` (type: `boolean`):

Add the names of likely relatives and associates to each record.

## `includePreviousOwners` (type: `boolean`):

For phone searches, also return people who held the number before its current owner.

## `acceptTerms` (type: `boolean`):

Required. I confirm I have a lawful purpose for this data and that I will NOT use it for credit, insurance, employment, tenant screening or any other FCRA-regulated decision, nor for stalking or harassment. I am the data controller for the results and am responsible for how they are used, including honoring opt-out and deletion requests.

## Actor input object example

```json
{
  "searches": [
    "John Smith, Maple Valley, WA",
    "(425) 281-1646",
    "1600 Main St, Dallas, TX"
  ],
  "people": [
    {
      "firstName": "John",
      "lastName": "Smith",
      "city": "Maple Valley",
      "state": "WA",
      "minAge": 55,
      "maxAge": 70
    }
  ],
  "maxResultsPerSearch": 1,
  "matchConfidence": "balanced",
  "crossVerify": false,
  "includeRelatives": true,
  "includePreviousOwners": false,
  "acceptTerms": true
}
```

# Actor output Schema

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

Every located person with their addresses, phone numbers, emails, aliases and match score.

## `overview` (type: `string`):

The same rows as a spreadsheet-style table, with the most useful columns first.

# 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": [
        "John Smith, Maple Valley, WA",
        "(425) 281-1646",
        "1600 Main St, Dallas, TX"
    ],
    "people": [
        {
            "firstName": "John",
            "lastName": "Smith",
            "city": "Maple Valley",
            "state": "WA",
            "minAge": 55,
            "maxAge": 70
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("logical_vivacity/skip-trace-people-search").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": [
        "John Smith, Maple Valley, WA",
        "(425) 281-1646",
        "1600 Main St, Dallas, TX",
    ],
    "people": [{
            "firstName": "John",
            "lastName": "Smith",
            "city": "Maple Valley",
            "state": "WA",
            "minAge": 55,
            "maxAge": 70,
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("logical_vivacity/skip-trace-people-search").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": [
    "John Smith, Maple Valley, WA",
    "(425) 281-1646",
    "1600 Main St, Dallas, TX"
  ],
  "people": [
    {
      "firstName": "John",
      "lastName": "Smith",
      "city": "Maple Valley",
      "state": "WA",
      "minAge": 55,
      "maxAge": 70
    }
  ]
}' |
apify call logical_vivacity/skip-trace-people-search --silent --output-dataset

```

## MCP server setup

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

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/CGsOhWyakcuUCcqAN/builds/5csvvUamT5R3zmVxL/openapi.json
