# Real Estate Skip Trace | Owner Phone & Email | $12/1K (`memo23/property-skip-tracing`) Actor

Paste a US property address and get the people on it: phones, emails, mailing address, absentee flag, relatives. One row per person. Deep-search extra sites on a miss, plus Dallas County owner-of-record. Pay only on matches. $12 per 1,000 matches. Lawful B2B — not for FCRA.

- **URL**: https://apify.com/memo23/property-skip-tracing.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Lead generation, Business
- **Features:** Limited permissions
- **Stats:** 46 total users, 7 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 skip trace matches

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

## Property Skip Tracing — Address to People Lookup 🏠🔎

**Turn a US property address into named leads in seconds.** Submit a street address and get back the people connected to it — current and former residents with phones, emails, age, current city, prior locations and relatives — plus the **owner of record from county appraisal data** where available (Dallas County, TX today). Built for wholesalers, real-estate investors, title researchers, and B2B due-diligence teams who start from a property list, not a name.

**You pay when an address returns people.** A blank lookup costs nothing, except in Dallas County, where the county's owner of record comes back as one owner-only row (turn `ownerOnlyRows` off to skip it).

#### How it works

![How Property Skip Tracing works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-property-skip-tracing.png)

#### ✨ Why use this Actor?

- **Address-first by design.** Pass `street` + `citystatezip` and get everyone associated with that address — no need to know a name first.
- **Four people-search sites, one row per person.** ThatsThem first; when nobody there has a phone or email, TruePeopleSearch, SearchPeopleFree and USPhoneBook are checked in turn. The same person found on several sites is merged into one row with every phone and email.
- **The real owner, not just residents.** For Dallas County addresses the county appraisal district's owner of record, mailing address and account id go on every row, and the resident who matches the owner is flagged (`isCountyOwner`). When no site finds anyone living there, you still get one row with the owner of record and an absentee flag.
- **Typed phones.** `phoneDetails` gives each number's line type (Wireless / Landline / Voip), carrier and last-seen month where the site shows them.
- **Pay only on matches.** The `SkipTraceMatch` event fires once per address that returns at least one person. An address where only the county owner comes back is billed one `OwnerRecord` event instead; other empty lookups cost nothing beyond the run start.
- **One row per person.** Output is flat and denormalized with the input address — drop it straight into a CSV, Google Sheet, or dialer with no joins.
- **Single, bulk, or file input.** One address, an array of addresses, or a public CSV/TXT URL — no custom plumbing.
- **Built-in deduplication.** The same person appearing more than once is removed automatically.
- **HTML run report.** Match rate, per-address breakdown, and the lawful-use reminder, saved to the run's key-value store.
- **Standard Apify exports.** JSON, CSV, Excel, plus a webhook to push each record to Zapier / Make / GoHighLevel.

#### 🎯 Use cases

| You are a… | Use it to… |
|---|---|
| Wholesaler / real-estate investor | Turn a distressed-property list into named leads for cold outreach |
| Owner-occupancy checker | See who currently lives at a property — spot likely-absentee owners for direct mail |
| Title / probate researcher | Pull current and former occupants for genealogy / probate context |
| B2B due-diligence / fraud analyst | Cross-check who is associated with a registered business address |
| Process server / investigator | Confirm the people tied to an address before lawful service |

#### 📥 Supported inputs

| Input | Example | Returns |
|---|---|---|
| **Addresses** (one-line) | `["3828 Double Oak Ln, Irving, TX 75061"]` | People connected to each address |
| **Single address** (split) | `street: "3828 Double Oak Ln"`, `citystatezip: "Irving, TX 75061"` | Same lookup, two boxes |
| **Bulk addresses** | `[{ street, citystatezip }, …]` | People for each address, one row per person |
| **Addresses from URL** | `https://example.com/leads.csv` | People for every row of a two-column CSV/TXT |
| **Direct URL** (advanced) | `https://thatsthem.com/address/3828-Double-Oak-Ln-Irving-TX-75061` | Scraped verbatim and parsed the same way |

**Not supported:** international addresses (US-only), records behind a login, and any premium "unlock"-gated report pages.

#### 🔄 How it works

1. **Look up the owner of record** in the county appraisal district's data (Dallas County, TX today), alongside the people search.
2. **Search ThatsThem** for the address and read every person with their phones and emails.
3. **Deep search:** while nobody has a phone or email, or the county owner is missing, check TruePeopleSearch, SearchPeopleFree and USPhoneBook in turn, fetching the owner's profile first. On TruePeopleSearch and SearchPeopleFree, up to two more results pages are checked when the owner isn't on the first. The run moves on as soon as the address has what you need.
4. **Merge people** found on several sites into one row and stamp the county owner fields on every row. People with a phone or email come first, the owner first among them. If nobody turned up but the county has an owner, that owner becomes the address's one row (`lookupStatus: "owner_only"`).
5. **Charge once per matched address**, then **push one row per person** to the dataset (capped at your `maxItems`).

#### ⚙️ Input parameters

| Field | Type | Description |
|---|---|---|
| `addresses` | array | Full one-line US addresses (`123 Main St, Dallas, TX 75201`). Same paste format as other property skip-trace tools. |
| `street` | string | US street address line (optional if `addresses` is set). |
| `citystatezip` | string | `City, ST ZIP` (optional if `addresses` is set). |
| `includePhone` | boolean | Deliver phones. Default `true`. |
| `includeEmail` | boolean | Deliver emails. Default `true`. |
| `bulkAddresses` | array | Array of `{ street, citystatezip }` objects. |
| `addressesFromUrl` | string | Public CSV/TXT URL with two columns: `street, citystatezip`. A Google Sheets link works when shared with anyone who has the link; a link that answers with an error or a web page gives no addresses. |
| `startUrls` | array | Direct thatsthem.com URLs, scraped as-is (advanced). |
| `webhookUrl` | string | Each person record is POSTed here as JSON as it's found. Best-effort. |
| `deepSearch` | boolean | When ThatsThem has nobody with a phone or email (or misses the county owner), check TruePeopleSearch, SearchPeopleFree and USPhoneBook in turn. No extra charge. Default `true`. |
| `ownerLookup` | boolean | Add the county appraisal district's owner of record, mailing address and account id to every row and flag the matching resident. Dallas County, TX today; other addresses get null owner fields. Free. Default `true`. |
| `ownerOnlyRows` | boolean | When no site finds anyone at an address but the county has an owner of record, return one row with that owner, their mailing address, account id and an absentee flag. Billed as one `OwnerRecord` event. Default `true`. |
| `includeContacts` | boolean | Deliver full phone numbers & emails on each row (billed per person that has them). Default `true`. |
| `demoMode` | boolean | Return one sample record with no lookup and no charge. Default `false`. |
| `maxItems` | integer | Hard cap on person records returned. Default `1000`. |
| `maxConcurrency` | integer | How many addresses to fetch in parallel. Default `8`. |

#### 📊 Output overview

The dataset contains **one row per person** connected to the input address. Every row is denormalized with the `inputStreet` and `inputCityStateZip` you submitted, so the file is ready for CSV / Sheet workflows with no joins. Fields the source doesn't have for a given person come back `null` rather than guessed.

#### 📦 Output sample

```json
{
  "inputStreet": "123 Sample St",
  "inputCityStateZip": "Dallas, TX 75201",
  "name": "Jane Q. Sample",
  "personId": "Jane-Q-Sample",
  "age": 40,
  "livesIn": "Dallas, TX",
  "usedToLiveIn": "Austin, TX",
  "relatedTo": "John Sample, Mary Sample",
  "phones": "(214) 555-0134",
  "emails": "jane.q.sample@example.com",
  "propertyAddress": "123 Sample St, Dallas, TX 75201",
  "ownerFullName": "Jane Q. Sample",
  "ownerMailingAddress": "123 Sample St, Dallas, TX 75201",
  "isAbsentee": false,
  "lookupStatus": "contact",
  "phoneNumbers": [
    "(214) 555-0134"
  ],
  "emailAddresses": [
    "jane.q.sample@example.com"
  ],
  "phoneDetails": [
    {
      "number": "(214) 555-0134",
      "type": "Wireless",
      "carrier": "Sample Wireless",
      "firstReported": null,
      "lastReported": "Jul 2026",
      "isPrimary": true,
      "isInactive": false
    }
  ],
  "source": "thatsthem, truepeoplesearch",
  "countyOwnerName": "SAMPLE JANE Q",
  "countyOwnerMailingAddress": "123 SAMPLE ST, DALLAS, TX 75201-0000",
  "countyOwnerAccountId": "00000000000000000",
  "countyOwnerSource": "dcad",
  "isCountyOwner": true,
  "relatives": [
    "John Sample",
    "Mary Sample"
  ],
  "sourceUrl": "https://thatsthem.com/address/123-Sample-St-Dallas-TX-75201",
  "profileUrl": "https://thatsthem.com/name/Jane-Q-Sample",
  "page": 1,
  "scrapedAt": "2026-09-19T08:00:00.000Z"
}
```

#### 🗂 Key output fields

| Field | Type | Notes |
|---|---|---|
| `inputStreet` | string | Street address you submitted (denormalized on every row) |
| `inputCityStateZip` | string | City/state/ZIP you submitted |
| `name` | string | Full name of the connected person |
| `personId` | string | Stable identifier derived from the source profile |
| `age` | integer | null | Reported age when available |
| `livesIn` | string | null | Most recent city/state of residence |
| `usedToLiveIn` | string | null | Prior cities/states, comma-separated |
| `relatedTo` | string | null | Reported relatives / associates, comma-separated |
| `phones` | string | null | Full phone numbers, comma-separated (with `includeContacts`) |
| `emails` | string | null | Full email addresses, comma-separated (with `includeContacts`) |
| `phoneDetails` | object\[] | Each phone with `type` (Wireless / Landline / Voip), `carrier`, `firstReported`, `lastReported`, `isPrimary`, `isInactive` where the site shows them. Same shape as our TruePeopleSearch and FastPeopleSearch actors. |
| `source` | string | Sites the person was found on, e.g. `thatsthem, truepeoplesearch` |
| `countyOwnerName` | string | null | Owner of record from the county appraisal district, e.g. `SMITH JOHN A & SMITH MARY B`. Null outside supported counties. |
| `countyOwnerMailingAddress` | string | null | The county owner's mailing address (spot absentee owners) |
| `countyOwnerAccountId` / `countyOwnerSource` | string | null | County account id and which district answered (`dcad`) |
| `isCountyOwner` | boolean | null | True for the resident whose name matches the county owner; null when there is no county record |
| `lookupStatus` | string | `contact` (the row has a phone or email), `name_only`, or `owner_only` (nobody found at the address; the row is the county owner) |
| `isAbsentee` | boolean | null | The person lives elsewhere; on an `owner_only` row, the owner's mailing address is not the property |
| `profileUrl` | string | Public profile URL on the source |
| `page` | integer | Result page index (single-hop, always `1`) |
| `scrapedAt` | string | ISO timestamp of the scrape |

#### 💰 Pricing

Pay-per-event, charged only for what you get:

- **Actor start** — a small fixed charge once per run.
- **`SkipTraceMatch`** — charged **only** when an address returns at least one person. Empty lookups are not charged.
- **`ContactInfo`** — charged only per delivered person who actually has a phone number or email on file (people without contact data are free). Turn `includeContacts` off to skip both the fields and the charge.
- **`OwnerRecord`** — charged per `owner_only` row: an address where no site found anyone but the county has an owner of record. Turn `ownerOnlyRows` off to skip these rows and the charge.

There's also a **free demo mode** (`demoMode: true`) that returns a sample record with no lookup and no charge, so you can preview the exact output shape before scaling.

#### ❓ FAQ

**Where does the data come from?** The Actor reads publicly available people-search content and returns the people the source associates with an address. Profile URLs in each record link back to the source.

**What if no people are returned for an address?** With `deepSearch` on (the default), the address is checked on TruePeopleSearch, SearchPeopleFree and USPhoneBook as well. If every site comes up empty, you're not charged the match event for it. For a Dallas County address the county's owner of record is returned as one `owner_only` row instead (one `OwnerRecord` event; turn `ownerOnlyRows` off to skip it). The run-start charge still applies once per run.

**Where does the owner of record come from?** From the county appraisal district (for Dallas County, TX: DCAD's public property search). The owner can be a person, a couple, a company or a trust; the resident whose name matches is flagged with `isCountyOwner`. Other counties are on the roadmap; for now their rows carry null owner fields.

**Some sites answer for a nearby address — do I get those people?** No. SearchPeopleFree and USPhoneBook sometimes answer a lookup with a similar street ("123 W Main St" for "123 Main St", or "Main Ave" for "Main St"). Pages for a different house number, street direction, street type or ZIP are discarded. Include the ZIP in your address: without one, a street you wrote without its direction ("Main St" when the county has "W Main St") can only be checked against the site's spelling, so those pages are discarded too.

**Why do some addresses return people who don't live there now?** Public records list everyone historically associated with an address — current owner, previous tenants, and their relatives. Use `livesIn` / `usedToLiveIn` to filter.

**What does a run on the free Apify plan get?** Up to 3 addresses per run. The first three rows of a run are complete; in later rows the phone numbers and emails are partly hidden, the owner's mailing address, the relatives and the source links are hidden, and the row carries a `freePlanNote` field saying so. Pages are fetched through Apify Proxy in your own Apify account (Apify's unblocker first, residential as a second try), so a free run uses your account's proxy allowance. If the sites refuse those requests, or the account has neither proxy group, the run finishes with no rows, nothing is charged for results, and the run's status message says why. Any paid Apify plan uses the full data path and returns every field in full.

**Are international addresses supported?** No — US addresses only.

**Can I bulk-process a list?** Yes. Use `bulkAddresses` for an array, or `addressesFromUrl` for a two-column CSV/TXT.

**Can I use this to deny someone housing, credit, or a job?** No. This Actor is not a consumer reporting agency and is not FCRA-regulated — see the Disclaimer.

#### 💬 Support

Found a missing field or an address that didn't parse? Open an issue from the Actor's **Issues** tab on Apify with the input you used.

#### 🔎 Explore more scrapers

Need name / phone / email lookups too? Try the companion **[Skip Trace — People, Phone & Address Finder](https://apify.com/memo23/skip-trace-people-finder)** for reverse lookups by any identifier, plus full unmasked phone numbers and address history. Browse the developer's other people-data and lead-generation Actors on the Apify Store.

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (`memo23/property-skip-tracing`).

**Purpose:** US address → people on that property (current + former residents). One dataset row per person, stamped with the input address.

**Minimal input:**

```json
{ "addresses": ["3828 Double Oak Ln, Irving, TX 75061"], "maxItems": 5 }
```

**Output:** `inputStreet`, `inputCityStateZip`, `propertyAddress`, `name` / `ownerFullName`, `age`, `livesIn`, `usedToLiveIn`, `relatedTo` / `relatives[]`, `phones` / `phoneNumbers[]`, `phoneDetails[]` (type, carrier, dates), `emails` / `emailAddresses[]`, `ownerMailingAddress`, `isAbsentee`, `lookupStatus` (`contact`, `name_only` or `owner_only`), `source`, `countyOwnerName`, `countyOwnerMailingAddress`, `countyOwnerAccountId`, `countyOwnerSource`, `isCountyOwner`, `profileUrl`, `sourceUrl`, `scrapedAt`.

**Behaviors an agent should know:**

- Prefer `addresses` (one-line strings). `street` + `citystatezip` still work.
- Always set `maxItems`. One address can return many people; each row is a person, not an address.
- Empty addresses are not billed the match event. `includePhone` / `includeEmail` default true.
- `countyOwnerName` is the owner of record (Dallas County, TX today); `ownerFullName` is the person on the row. Filter `isCountyOwner: true` with `lookupStatus: "contact"` for the owner's own phones and emails; `owner_only` rows carry the county owner with no contact data.
- US only. Not for FCRA decisions.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Zillow Group, ThatsThem, TruePeopleSearch, SearchPeopleFree, USPhoneBook, the Dallas Central Appraisal District, or any consumer reporting agency. Brand and source names are used solely descriptively to identify the public data the Actor reads. All trademarks are the property of their respective owners.

**Lawful B2B use only.** This Actor returns information about individuals derived from public records. It is **NOT** a consumer reporting agency and its output is **NOT** a "consumer report" under the U.S. Fair Credit Reporting Act (FCRA). You **may not** use any output — directly or indirectly — as a factor in establishing a person's eligibility for credit or insurance, employment, housing or tenant screening, or any other purpose covered by Section 604 of the FCRA (15 U.S.C. § 1681b). You are also responsible for compliance with all applicable privacy laws (CCPA/CPRA, VCDPA, CPA, GDPR, DPPA, GLBA, and any sector-specific regulations). If you are unsure whether your use is permitted, consult qualified legal counsel.

***

### SEO Keywords

property skip tracing, skip tracing scraper, address to owner lookup, owner lookup by address, real estate skip trace, wholesaler skip tracing, absentee owner finder, address to people lookup, reverse address lookup, people search by address, distressed property leads, real estate lead generation, resident lookup, current and former residents, relatives lookup, probate research, title research, b2b due diligence address, thatsthem scraper, apify skip trace, pay per match skip tracing, us address people finder

# Actor input Schema

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

Full US addresses, one per line, e.g. "123 Main St, Dallas, TX 75201". 1–500 per run. Each address that returns at least one person is billed as one match. Do not use this for name search — this actor is address-first.

## `street` (type: `string`):

US street address line, including number and street name (e.g. "3828 Double Oak Ln"). Optional if you filled Addresses.

## `citystatezip` (type: `string`):

Format: "City, ST ZIP" (e.g. "Irving, TX 75061"). State must be a 2-letter US code; ZIP is 5 digits (optional +4). Optional if you filled Addresses.

## `bulkAddresses` (type: `array`):

Array of { "street", "citystatezip" } objects. Example item: { "street": "3828 Double Oak Ln", "citystatezip": "Irving, TX 75061" }

## `addressesFromUrl` (type: `string`):

Public CSV/TXT URL with two columns: street, citystatezip (header row optional). One address per line. Comma- or tab-separated. A Google Sheets link works when the sheet is shared with anyone who has the link. A link that answers with an error or a web page gives no addresses.

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

Direct thatsthem.com URLs to scrape as-is.

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

## `deepSearch` (type: `boolean`):

When the first source finds nobody with a phone or email at an address (or misses the county owner), check TruePeopleSearch, SearchPeopleFree and USPhoneBook in turn until someone with contact data turns up. People found on several sites are merged into one row. No extra event is charged for the extra sites; you still pay per matched address and per person with contact data.

## `ownerLookup` (type: `boolean`):

Look the address up in the county appraisal district's records and add the owner of record, their mailing address and the county account id to every row, flagging the resident who matches the owner (isCountyOwner). Supported today: Dallas County, TX (DCAD). Other addresses get null owner fields. Free.

## `ownerOnlyRows` (type: `boolean`):

When no people-search site finds anyone at an address but the county has an owner of record, return one row with the owner's name, mailing address, county account id and an absentee flag (lookupStatus "owner_only"). Billed as one Owner record event per row. Needs Owner of record on; Dallas County, TX today.

## `includeContacts` (type: `boolean`):

Master switch. When false, phones and emails are omitted and ContactInfo is not billed. Default true. Prefer includePhone / includeEmail to turn one side off.

## `includePhone` (type: `boolean`):

When true (default), deliver phone numbers on each person row. Ignored when includeContacts is false. Same job as other property skip-trace tools' includePhone.

## `includeEmail` (type: `boolean`):

When true (default), deliver emails on each person row. Ignored when includeContacts is false. Same job as other property skip-trace tools' includeEmail.

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

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

How many addresses (lookups) to fetch in parallel.

## Actor input object example

```json
{
  "addresses": [
    "3828 Double Oak Ln, Irving, TX 75061"
  ],
  "deepSearch": true,
  "ownerLookup": true,
  "ownerOnlyRows": true,
  "includeContacts": true,
  "includePhone": true,
  "includeEmail": true,
  "demoMode": false,
  "maxItems": 1000,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

One record per person found — name, age, current city, prior cities, relatives, and profile URL, stamped with the input address.

## `htmlReport` (type: `string`):

Match rate, per-address results (matched / no match / failed, charged or not), and the lawful-use reminder.

# 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 = {
    "addresses": [
        "3828 Double Oak Ln, Irving, TX 75061"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/property-skip-tracing").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 = { "addresses": ["3828 Double Oak Ln, Irving, TX 75061"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/property-skip-tracing").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 '{
  "addresses": [
    "3828 Double Oak Ln, Irving, TX 75061"
  ]
}' |
apify call memo23/property-skip-tracing --silent --output-dataset

```

## MCP server setup

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

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/h0M4hKUDhvKMiqb5O/builds/uIoWONEsQJYeuGz8Q/openapi.json
