# Skip Trace API - Property Owner Phone, Email and Address (`nabeelbaghoor/skip-trace-api`) Actor

Skip trace US property owners and search 150M+ property records. Turn addresses into owner phone numbers and emails with do-not-call and litigator flags, run a phone or email back to the person and their properties, or pull absentee owner, high equity, vacant and preforeclosure lists.

- **URL**: https://apify.com/nabeelbaghoor/skip-trace-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Real estate, Lead generation, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.00 / 1,000 property record returneds

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

## Skip Trace API - Property Owner Phone, Email and Address

Turn a list of US property addresses into the owner's phone numbers and email addresses, or search 150M+ property records for the owners worth calling in the first place.

### What this actor does

- **Skip trace by address.** Paste property addresses, get the owner's name, every phone number with its type and carrier, and every email address. Up to three people per property.
- **Reverse skip trace.** Start from a phone number or an email address and get the person plus the property addresses they are on. Filter to property owners only.
- **Search the property database.** Filter by location, owner name, street address, listing status and last sale date, then narrow with the provider's own named lists: absentee owner, high equity, vacant, preforeclosure, tax default, cash buyer, tired landlord, inherited, free and clear and thirty more.
- **Compliance flags on every number.** Each phone carries its do-not-call and litigator status, and every row also carries a ready-to-dial list with those numbers already removed.
- **Full records, not just the table.** Each row keeps the provider's complete record alongside the flattened columns, so nothing your plan returns is thrown away.
- **Pay per result.** You are charged for rows that carry a real record. Addresses the provider matches nobody to are free.

### Bring your own key

This actor calls the provider with **your own API token**. Paste it into the API token field, or set it as the `DATA_API_KEY` secret. Nothing runs on anyone else's credentials, and a run without a token ends cleanly with an explanation rather than failing.

### Example output

```json
{
  "recordType": "owner-contact",
  "requested": "1011 Rosegold St, Franklin Square, NY 11010",
  "found": true,
  "fullAddress": "1011 Rosegold St, Franklin Square, NY 11010-2507",
  "city": "Franklin Square",
  "county": "Nassau",
  "state": "NY",
  "zip": "11010",
  "personName": "John Doe",
  "isPropertyOwner": true,
  "deceased": false,
  "bestPhone": "1112223333",
  "bestPhoneType": "Mobile",
  "bestPhoneCarrier": "OMNIPOINT COMMUNICATIONS- INC.",
  "bestPhoneDnc": false,
  "bestPhoneTcpa": false,
  "phoneCount": 4,
  "callablePhones": "1112223333, 4445556666",
  "emailCount": 1,
  "emails": "johndoe@gmail.net"
}
```

### FAQ

#### What is skip tracing?

Skip tracing is looking up the current contact details of a property owner from the property address. This actor sends each address to a US property and contact database and returns the owner's name, phone numbers with their type and carrier, and email addresses, along with whether each number is on the do-not-call registry or belongs to a known TCPA litigator.

#### Which addresses can be skip traced?

Any US property address with a street plus either a five digit ZIP code or both a city and a two letter state. `1011 Rosegold St, Franklin Square, NY 11010` and `25866 W Globe Ave, 85326` both work. An address with too little to match on is returned as a rejected row with the reason, and is not charged for.

#### How do I find motivated sellers?

Use search mode with the named lists. `preforeclosure`, `notice-of-default`, `tax-default`, `inherited`, `tired-landlord`, `vacant` and `absentee-owner` are the ones investors use most. Combine up to three that must all match, or up to three where any one may match, then turn on "Add owner contacts to search results" to get phone numbers in the same run.

#### Do I get do-not-call and litigator flags?

Yes. Every phone number carries `dnc` and `tcpa` booleans, the best-phone columns repeat them, and each row also has a `callablePhones` column with the restricted numbers already stripped out. You can also have the provider drop restricted numbers before they are returned by turning off "Include restricted phone numbers".

#### Can I look up a person from a phone number?

Yes, that is reverse skip trace mode. Give a ten digit US phone number or an email address and the actor returns the matching people, their known addresses, their other phone numbers and emails, and whether each person owns the property at their top ranked address. Turn on "Property owners only" to keep just the owners.

#### What does it cost?

Pricing is pay per result: 0.014 USD per property record from a search and 0.02 USD per person returned by a skip trace, with Apify platform usage included. Rows the provider found nothing for are not charged. You also need your own account with the data provider, which bills separately for the records it returns.

#### Does the actor fail if my key is wrong?

No. A missing token, a rejected token, an empty balance or an empty input all end the run cleanly with a message saying what to change. Only a real outage or a bug fails the run.

#### How many addresses can I send at once?

As many as you like. The provider accepts 100 per request, so the actor batches longer lists automatically and paces the requests. Use the maximum rows setting to cap what a run collects and charges for.

### Keyword map

skip trace API, skip tracing API, property owner lookup, owner phone number lookup, reverse phone lookup API, reverse email lookup, real estate lead generation API, absentee owner list, high equity property list, preforeclosure leads, vacant property list, tired landlord list, cash buyer list, property records API, US property data API, DNC scrub, TCPA litigator check, motivated seller leads, real estate investor data, property owner contact information

# Actor input Schema

## `mode` (type: `string`):

Search finds properties matching your filters. Skip trace turns a list of property addresses into the owner's phone numbers and email addresses. Reverse skip trace goes the other way, from a phone number or email address to the person and the properties they are on.

## `location` (type: `string`):

Search mode. A partial USPS address that narrows the search to one area, for example "Phoenix, AZ", "Maricopa County, AZ" or "85086". Owner name searches always need a location.

## `quickLists` (type: `array`):

Search mode. The provider's own business-rule lists. Every list you pick must match, and at most three may be combined in one search. Prefix a value with not- to exclude it, for example not-owner-occupied.

## `anyOfQuickLists` (type: `array`):

Search mode. The same business-rule lists, but a property matches if any one of them applies. Use this for a wider net, for example distressed sellers across notice-of-default, preforeclosure and tax-default. At most three.

## `ownerFirstName` (type: `string`):

Search mode. Matched word by word, in any order and ignoring case, so you do not need to know how the county stored the name. Giving both a first and a last name matches only when both appear on the same owner record. Needs a location.

## `ownerLastName` (type: `string`):

Search mode. Matched the same way as the first name. Needs a location.

## `addressStreet` (type: `string`):

Search mode. Narrows the search to one address, for example "41028 N Congressional Dr".

## `addressCity` (type: `string`):

Search mode. The city for the street address above.

## `addressState` (type: `string`):

Search mode. The two letter state code for the street address above, for example AZ.

## `addressZip` (type: `string`):

Search mode. The five digit ZIP code for the street address above.

## `listingStatus` (type: `array`):

Search mode. Keeps only properties whose current listing status is one of these, for example Active or Pending. One per line.

## `soldFrom` (type: `string`):

Search mode. Keeps only properties whose last sale is on or after this date, written as YYYY-MM-DD.

## `soldTo` (type: `string`):

Search mode. Keeps only properties whose last sale is on or before this date, written as YYYY-MM-DD.

## `searchCriteria` (type: `object`):

Search mode, optional. Any further criteria in the provider's own format, merged over the fields above. The provider indexes more than twenty sections including assessment, building, foreclosure, lot, openLien, tax and valuation, so this is how to reach one the form does not cover.

## `datasets` (type: `array`):

Search mode, optional. Which sections of each property record to return. Leave empty for everything your plan allows. Richer sections cost more per record on the provider's side. Basic and core are mutually exclusive; if you pick both, core is used.

## `includeOwnerContacts` (type: `boolean`):

Search mode. Asks the provider to enrich each matched property with the owner's phone numbers and email addresses. The provider charges extra for every property it matches contacts to, on top of the property record itself.

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

Skip trace mode. One property address per line. Each needs a street plus either a five digit ZIP or both a city and a two letter state, for example "1011 Rosegold St, Franklin Square, NY 11010".

## `phonesOrEmails` (type: `array`):

Reverse skip trace mode. One ten digit US phone number or email address per line. Dashes, spaces, brackets and a leading 1 are all fine.

## `includeRestrictedPhones` (type: `boolean`):

Skip trace and reverse skip trace. Keeps numbers flagged under the Telephone Consumer Protection Act in the results, each marked so you can exclude it yourself. Every row also carries a separate ready-to-dial list with do-not-call and litigator numbers already removed. Turn this off to have the provider drop them.

## `propertyOwnersOnly` (type: `boolean`):

Reverse skip trace mode. Returns only people who own the property at their highest ranked address. The provider applies this before its three person limit, so the results are not simply a subset of an unfiltered run and can surface an owner an unfiltered run would miss.

## `maxResults` (type: `integer`):

The most rows this run will save and charge for. The provider bills per record returned, so this is the spending control on both sides.

## `pageSize` (type: `integer`):

Search mode. How many properties to ask for at a time, up to the provider's ceiling of 100. A wider page is not a cheaper one, because billing counts records rather than requests.

## `requestsPerMinute` (type: `integer`):

How fast to call the provider. Lower this if your plan rate limits the run.

## `apiKey` (type: `string`):

Your own API token for the property and skip trace provider, taken from your account. This actor is bring your own key: it never uses anyone else's credentials, and the token is stored as a secret.

## Actor input object example

```json
{
  "mode": "search",
  "includeOwnerContacts": false,
  "includeRestrictedPhones": true,
  "propertyOwnersOnly": false,
  "maxResults": 1000,
  "pageSize": 100,
  "requestsPerMinute": 60
}
```

# Actor output Schema

## `records` (type: `string`):

One row per record, alongside the address, phone number, email address or search that produced it.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/skip-trace-api").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/skip-trace-api").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 '{}' |
apify call nabeelbaghoor/skip-trace-api --silent --output-dataset

```

## MCP server setup

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

```

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/1dpgaMUF5GLHsCRP1/builds/fjY6q8PyT3x1ojD6p/openapi.json
