# Trulia Real Estate Scraper — Listings, Agents & Prices (`scrapersdelight/trulia-scraper`) Actor

Scrape Trulia for-sale, for-rent & sold property listings: address, price, beds/baths, sqft, lot, year built, property type, status, photos, MLS# — plus the listing agent & broker name and phone. By city, ZIP, or a Trulia search URL. US residential, no login.

- **URL**: https://apify.com/scrapersdelight/trulia-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Automation, Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 per listing scrapeds

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/platform/actors/running/actors-in-store#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

## 🏠 Trulia Real Estate Scraper — Listings, Agents & Prices

**Scrape Trulia *property listings* — address, price, beds/baths, sqft, lot, year built, property type, status, photos and MLS# — *plus* the listing agent & broker name and phone. Search by city or ZIP, pick for‑sale / for‑rent / sold, or paste Trulia URLs. US residential, no login.**

> 🕒 Straight from Trulia's own page data · 🇺🇸 US listings · 🚫 No login or API key · 📞 Agent & broker phone on each row

Turn any Trulia search into a clean, structured feed of property listings. Every listing comes back as one flat record: the full property core plus the listing agent and brokerage behind it — the same contact Trulia shows on the listing page. Export to JSON, CSV, Excel, or Google Sheets, or pull it via API.

***

### What it does

- 🏠 **Full listing record** — `address`, `city`, `state`, `zipcode`, `neighborhood`, `latitude`/`longitude`, `price`, `beds`, `baths`, `sqft`, `lotSize`, `propertyType`, `status`, `yearBuilt`, `photosCount`, `dateListed`, `zpid` and `listingId`.
- 📞 **Agent & broker contact** — `listingAgentName`, `listingAgentPhone`, `brokerName`, `brokerPhone` — the phone the others skip (opens each listing page; toggle off for a faster listings‑only feed).
- 🧾 **MLS + deal data** — `mlsName`, `mlsNumber`, `parcelNumber`, `propertySubtype`, `isForeclosure`, `pricePerSqft`.
- 🔎 **Search any way** — by **location** (`"Austin, TX"`, `"San Francisco, CA"`, `"78701"`), or by pasting **Trulia search / listing URLs**.
- 🏷️ **For sale, for rent, or recently sold** — pick the listing status for a location search.
- 🇺🇸 **Built for Trulia's anti‑bot** — runs on Apify **US residential** proxies with session seeding + automatic IP rotation, so listings come back populated, not blocked.

### 📊 Output — one flat record per listing

| Field | Type | Example |
|---|---|---|
| 🏠 `address` | text | `1204 Summit Edge Dr, Austin, TX 78732` |
| 💵 `price` | number | `650000` |
| 🛏️ `beds` / 🛁 `baths` | number | `3` / `2` |
| 📐 `sqft` | number | `1638` |
| 🏗️ `yearBuilt` | number | `2001` |
| 🏷️ `status` | text | `For Sale` |
| 🧑‍💼 `listingAgentName` | text | `Joy Brillante Lynn` |
| 📞 `listingAgentPhone` | text | `(512) 610-5000` |
| 🏢 `brokerName` | text | `Avalar Austin` |
| 🧾 `mlsNumber` | text | `3702957` |
| 🔗 `url` | link | `https://www.trulia.com/home/1204-summit-edge-dr-austin-tx-78732-29343961` |

Plus `streetAddress`, `city`, `state`, `zipcode`, `neighborhood`, `latitude`, `longitude`, `lotSize`, `propertyType`, `propertySubtype`, `isForeclosure`, `parcelNumber`, `pricePerSqft`, `photosCount`, `dateListed`, `brokerPhone`, `mlsName`, `zpid`, `listingId`, `description`.

<details><summary>🏠 Sample record</summary>

```json
{
  "url": "https://www.trulia.com/home/1204-summit-edge-dr-austin-tx-78732-29343961",
  "zpid": "29343961",
  "address": "1204 Summit Edge Dr, Austin, TX 78732",
  "city": "Austin", "state": "TX", "zipcode": "78732", "neighborhood": "River Place",
  "price": 650000, "beds": 3, "baths": 2, "sqft": 1638, "lotSize": "0.28 acres",
  "propertyType": "SINGLE_FAMILY_HOME", "status": "For Sale", "yearBuilt": 2001,
  "parcelNumber": "01295808090000", "photosCount": 40,
  "listingAgentName": "Joy Brillante Lynn", "listingAgentPhone": "(512) 610-5000",
  "brokerName": "Avalar Austin", "brokerPhone": "(512) 610-5000",
  "mlsName": "Unlock MLS", "mlsNumber": "3702957",
  "scraped_at": "2026-07-11T17:29:37.801Z"
}
```

</details>

> 💡 Agent/broker phone, MLS#, structured year built and parcel number come from the listing page. With **Include agent & broker contact** off, you still get the full property core and the agent/broker name from search, just faster.

***

### Who it's for

- 🏦 **Mortgage, title & insurance** — new‑listing addresses as a buying signal for refi/purchase outreach.
- 📈 **Real‑estate investors** — deal flow by market, new listings, foreclosures, price‑per‑sqft, parcel #.
- 🧩 **PropTech / CRM** — ingest a clean, structured listing feed by city or ZIP.
- 🛠️ **Vendors & agents** — reach the listing agent/broker behind each active listing.

### How to use it

1. Click **Try for free**.
2. Enter a **Search location** (e.g. `Austin, TX`) and pick a **Listing status** — *or* paste **Start URLs**.
3. Set **Max results** and click **Start**.
4. Export from the **Dataset** tab (JSON, CSV, Excel, Google Sheets) or via API.

#### Examples

Every for‑sale listing in a city:

```json
{ "searchLocation": "Austin, TX", "listingStatus": "for_sale", "maxResults": 100 }
```

For‑rent listings in a ZIP:

```json
{ "searchLocation": "78701", "listingStatus": "for_rent", "maxResults": 200 }
```

From a Trulia search URL you already have:

```json
{ "startUrls": ["https://www.trulia.com/for_sale/San_Francisco,CA/"], "maxResults": 200 }
```

***

### ❓ FAQ

**What contact do I actually get?** The listing agent name + phone and the brokerage name + phone, exactly as Trulia shows them on the listing page. Email is not publicly exposed by Trulia.

**Why do some rows have a null phone?** Agent/broker phone is read from the listing page; if that page is skipped (contact toggle off) or momentarily blocked, the row still returns with the full property core and the agent/broker name from search.

**Do I need a login or API key?** No. It reads Trulia's public listing data — no account, no key.

**Why residential proxies?** Trulia fronts PerimeterX and blocks datacenter IPs. The Actor defaults to Apify **US residential** with session seeding and IP rotation so pages return populated data.

**Can I scrape for‑rent or sold listings?** Yes — set `listingStatus` to `for_rent` or `sold` for a location search.

**Can I export to Excel or Google Sheets?** Yes — the dataset exports to JSON, CSV, Excel, or Google Sheets, or via API.

**How much does it cost?** Pay‑per‑result — you only pay for the listings returned. It's free to try.

### Notes & fair use

You are responsible for complying with Trulia's Terms of Service and all applicable laws. This Actor reads publicly available real‑estate listing data (the same listing + agent contact Trulia shows on each page). Use the contact data responsibly and in line with anti‑spam and privacy rules in your jurisdiction.

# Actor input Schema

## `searchLocation` (type: `string`):

City + state or ZIP to search on Trulia, e.g. "Austin, TX", "San Francisco, CA" or "78701". Every matching listing is scraped. Leave blank if you use Start URLs instead.

## `listingStatus` (type: `string`):

Which listings to pull for the Search location above: for sale, for rent, or recently sold.

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

Optional. Paste Trulia URLs directly — either search-results pages (e.g. https://www.trulia.com/for\_sale/Austin,TX/) or individual listing pages (https://www.trulia.com/home/...). Each type is auto-detected.

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

Cap on the number of listings returned this run (cost/speed guard). Default 100; set 0 to pull the whole search scope (up to a safety cap).

## `includeAgentContact` (type: `boolean`):

When on (default), each listing page is opened to add the listing agent & broker PHONE, MLS name + number, structured year built and parcel number. Turn off for a faster, listings-only feed (agent/broker name is still included from search).

## `requestConcurrency` (type: `integer`):

How many listing pages to fetch in parallel. Higher = faster; keep modest so Trulia's anti-bot doesn't throttle the run.

## `proxyConfiguration` (type: `object`):

Proxy settings. Trulia blocks datacenter IPs (PerimeterX), so US RESIDENTIAL is the default and strongly recommended for reliable results.

## Actor input object example

```json
{
  "searchLocation": "Austin, TX",
  "listingStatus": "for_sale",
  "maxResults": 5,
  "includeAgentContact": true,
  "requestConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

The dataset of scraped Trulia property listings (one item per listing).

# 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 = {
    "searchLocation": "Austin, TX",
    "listingStatus": "for_sale",
    "maxResults": 5,
    "includeAgentContact": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/trulia-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 = {
    "searchLocation": "Austin, TX",
    "listingStatus": "for_sale",
    "maxResults": 5,
    "includeAgentContact": True,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/trulia-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchLocation": "Austin, TX",
  "listingStatus": "for_sale",
  "maxResults": 5,
  "includeAgentContact": true
}' |
apify call scrapersdelight/trulia-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapersdelight/trulia-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/3y4jPfwkAHH9WSWab/builds/AijGpBwr7pfg5mRlf/openapi.json
