# Trulia Scraper (`scraptivo/trulia-scraper`) Actor

Collect Trulia for-sale, for-rent, and sold listings as structured data from search URLs or location queries, with optional property-page details such as description, photos, agent, and price history.

- **URL**: https://apify.com/scraptivo/trulia-scraper.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Categories:** Real estate, MCP servers, Developer tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.20 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

**Trulia Scraper** collects for-sale, for-rent, and sold listings from Trulia and turns them into structured data for market research and real-estate lead generation. Provide a location query like "Austin, TX" or a Trulia search URL, run the Actor, and export price, beds, baths, address, property type, and agent details to JSON, CSV, or Excel. Use it to monitor price changes, build lead lists, and track sold comps. Scraptivo pricing starts at $0.0025 per listing on the free plan.

[![Trulia Scraper — input to structured data](https://raw.githubusercontent.com/faizanalii/apify-actor-assets/main/trulia-scraper/trulia-scraper-value-demo.gif)](https://apify.com/scraptivo/trulia-scraper)

### What can you automate with Trulia Scraper?

- **Build targeted lead lists** — pull agent and broker names alongside every listing for outreach and CRM enrichment.
- **Monitor price changes** — track asking prices over time with per-property price history and estimated values.
- **Enrich listings with property-page details** — collect full descriptions, photo sets, features, and listing dates in one run.
- **Track sold comps** — capture sold listings and sold prices to support valuations and investment decisions.
- **Keep a fresh rental inventory** — collect for-rent listings with rent, beds, and baths for market analysis.
- **Schedule recurring collection** — run daily or weekly and export to JSON, CSV, or Excel automatically.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Real-estate agents and brokers | Build prospecting lists of active listings and agent contacts by city or ZIP. |
| Lead-generation agencies | Collect property records plus agent and broker names for outbound campaigns. |
| Investors and appraisers | Pull sold comps, price history, and estimated values for valuations. |
| Market researchers | Benchmark prices, inventory, and property mix across neighborhoods. |

### What data can you collect from Trulia?

| Data group | Example fields | How it helps |
|---|---|---|
| Location | `address`, `city`, `state`, `zipCode`, `neighborhood` | Map and segment listings by market. |
| Pricing | `formattedPrice`, `price`, `status`, `propertyType` | Compare asking prices and market type. |
| Size and layout | `bedrooms`, `bathrooms`, `livingArea`, `yearBuilt` | Filter by property size and age. |
| Agent and broker | `agentName`, `brokerName`, `mlsAttribution` | Identify listing parties for outreach. |
| Media and details | `imageUrl`, `description`, `photos`, `features`, `priceHistory` | Enrich listings when details are enabled. |

Some detail fields, such as the full description, photos, and price history, are only populated when you enable `includeListingDetails`. Fields like `agentPhone` depend on what Trulia exposes on the property page.

### How to use Trulia Scraper

1. Open [Trulia Scraper on Apify Store](https://apify.com/scraptivo/trulia-scraper).
2. Enter a `searchQueries` value such as `"Austin, TX"` or a 5-digit ZIP, or paste a Trulia search or listing URL into `startUrls`.
3. Choose `searchType` (`FOR_SALE`, `FOR_RENT`, or `SOLD`) and set `maxListings`.
4. Optionally enable `includeListingDetails` to collect descriptions, photos, agents, and price history.
5. Run the Actor and export the results to JSON, CSV, or Excel from the Output tab.

Minimal input example:

```json
{
  "searchQueries": ["Austin, TX"],
  "searchType": "FOR_SALE",
  "maxListings": 10,
  "includeListingDetails": true,
  "detailConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Example workflow

#### Build a weekly list of new listings for a target ZIP

1. Run `searchQueries` entry `"78744"` with `searchType` set to `FOR_SALE` every Monday.
2. Keep the records matching your price and bedroom criteria in a spreadsheet.
3. Send new rows to Google Sheets or your CRM.
4. Deduplicate across runs using the stable `listingId` field.

### Automate and integrate your results

Run Trulia Scraper on a schedule from the Apify Console **Schedules** tab — daily is usually enough for real-estate data, weekly for slower markets. Add a webhook on run completion to push fresh listings into your CRM, database, or notification pipeline. Connect the dataset to Google Sheets, Make, Zapier, or Slack, or call the Actor from your own code via the API:

```shell
curl -X POST "https://api.apify.com/v2/acts/scraptivo/trulia-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["Austin, TX"], "searchType": "FOR_SALE", "maxListings": 10}'
```

For deduplication across runs, key on the stable `listingId` field, which uniquely identifies each property.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---|---:|---|---|
| `startUrls` | array | No | — | Trulia search or listing URLs. Search URLs keep any filters already in the path. |
| `searchQueries` | array | No | — | Location queries such as `"Austin, TX"` or a ZIP, used when no URL is provided. |
| `searchType` | enum | No | `FOR_SALE` | Market applied to `searchQueries` only: `FOR_SALE`, `FOR_RENT`, or `SOLD`. |
| `maxListings` | integer | No | `10` | Maximum listings to collect across all URLs and queries (`0` = unlimited). |
| `includeListingDetails` | boolean | No | `false` | Open property pages for description, photos, agent, price history, and features. |
| `detailConcurrency` | integer | No | `5` | Parallel property-page fetches when details are enabled (1–20). |
| `proxyConfiguration` | object | No | residential | Proxy settings; residential proxies are the default. |

### Output example

```json
{
  "url": "https://www.trulia.com/home/1042-rosemont-st-1-austin-tx-78723-401885104",
  "listingId": "401885104_ZPID",
  "listingType": "RESALE",
  "status": "for sale",
  "propertyType": "single-family home",
  "address": "1042 Rosemont St #1, Austin, TX 78723",
  "city": "Austin",
  "state": "TX",
  "zipCode": "78723",
  "neighborhood": "Windsor Park",
  "formattedPrice": "$439,900",
  "price": 439900,
  "bedrooms": 3,
  "bathrooms": 3.5,
  "livingArea": "2,536 sqft",
  "yearBuilt": 2022,
  "imageUrl": "https://www.trulia.com/pictures/thumbs_4/zillowstatic/fp/66ce9ac7553744231dfea16f984f61b4-full.jpg",
  "description": "Spacious, modern East Austin opportunity! This newly built home offers a bright open-concept layout...",
  "dateListed": "2026-08-22T04:09:44+00:00",
  "estimatedValue": 436200,
  "estimatedRent": 3041,
  "agentName": "Steven Robertson",
  "agentPhone": "(XXX) XXX-XXXX",
  "brokerName": "Real Estate Diplomats",
  "mlsAttribution": "NTREIS, MLS#21365155",
  "photoCount": 15,
  "photos": [
    "https://www.trulia.com/pictures/thumbs_5/zillowstatic/fp/66ce9ac7553744231dfea16f984f61b4-full.jpg"
  ],
  "features": [
    { "name": "Parking", "value": "1 Car Garage" },
    { "name": "Living Area", "value": "2536 Square Feet" },
    { "name": "Year Built", "value": "2022" }
  ],
  "priceHistory": [
    { "date": "2026-08-22T00:00:00+00:00", "event": "Listed For Sale", "price": 439900 },
    { "date": "2025-12-11T00:00:00+00:00", "event": "PriceChange", "price": 499999 }
  ],
  "detailsFetched": true,
  "sourceQuery": "Austin, TX"
}
```

### How much does it cost to scrape Trulia?

Trulia Scraper uses pay-per-event billing. The primary `listing` event costs **$0.0025 per listing** ($2.50 per 1,000 listings), available on the free plan and as low as $0.0022 per listing on higher plans. When `includeListingDetails` is enabled, a `listing-details` event adds **$0.0025 per listing** for property pages that are successfully fetched. Each run also incurs a one-time **$0.00005** Actor Start fee.

For example, 1,000 listings cost about $2.50, and 10,000 listings about $25. A run with details enabled costs roughly double, since the `listing-details` event charges in addition to the `listing` event.

### Reliability and responsible use

Trulia Scraper defaults to residential proxies and retries automatically when Trulia presents an anti-bot challenge. Some detail fields are conditional and only appear when Trulia exposes them on the property page, so individual records may have empty values. The Actor collects publicly available listing data; you are responsible for using it in accordance with Trulia's terms and applicable law.

### Frequently asked questions

#### Can I scrape sold listings and rentals from Trulia?

Yes. Set `searchType` to `SOLD` or `FOR_RENT` when using `searchQueries`, or paste a Trulia `/sold/` or `/for_rent/` URL into `startUrls`. Sold listings include sold prices, and rentals include rent where Trulia exposes it.

#### Can I schedule Trulia Scraper to run automatically?

Yes. Create a recurring schedule from the Apify Console Schedules tab or via the API. A daily schedule keeps listings fresh; weekly works for slower markets.

#### What counts as one result?

One `listing` event is charged for each property record pushed to your dataset. If `includeListingDetails` is on and a detail page is fetched successfully, an additional `listing-details` event is charged for that same property.

#### Why are some fields empty?

Some fields, including `description`, `photos`, `features`, and `priceHistory`, are only populated when `includeListingDetails` is enabled. Others, such as `agentPhone` or `estimatedValue`, appear only when Trulia exposes them on the property page.

#### How do I avoid duplicate records?

Key on the stable `listingId` field, which uniquely identifies each property. If you write results into an existing dataset by `datasetId`, Apify also deduplicates identical records automatically.

#### Do I need a proxy?

Residential proxies are the default and recommended. Trulia may show an anti-bot challenge on some IPs; the Actor rotates proxies and retries automatically.

### Related Scraptivo automations

- [Realtor.com Scraper](https://apify.com/scraptivo/realtor-scraper) — collect Realtor.com listings with full search filters.
- [Redfin Scraper](https://apify.com/scraptivo/redfin-scraper) — collect Redfin listings and market data.
- [Zillow Agents Vault](https://apify.com/scraptivo/zillow-agents-vault) — build agent and broker lead lists from Zillow.
- [Rightmove Scraper](https://apify.com/scraptivo/rightmove-scraper) — collect UK property listings from Rightmove.
- [Apartments.com Scraper](https://apify.com/scraptivo/apartments-scraper) — collect rental listings from Apartments.com.
- [Funda Netherlands Real Estate Scraper](https://apify.com/scraptivo/funda-nl-scraper) — collect Dutch listings from Funda.nl.

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, a sample URL, the required fields, and your expected volume so we can assess the request.

# Actor input Schema

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

Trulia search or listing URLs. Search URLs keep any filters already in the path (beds, pets, property type, page) — e.g. https://www.trulia.com/for\_sale/Austin,TX/ or https://www.trulia.com/for\_rent/Austin,TX/4p\_beds/cats\_pets/. Listing URLs (/home/ or /building/) scrape that property.

## `searchQueries` (type: `array`):

Location queries used when you do not have a URL — e.g. "Austin, TX", "Austin TX", or a 5-digit ZIP. Combined with Search type to build a Trulia search URL.

## `searchType` (type: `string`):

Market applied to searchQueries only. Start URLs already encode for-sale, for-rent, or sold.

## `maxListings` (type: `integer`):

Maximum listings to scrape (0 = unlimited). Enforced across all URLs and queries.

## `includeListingDetails` (type: `boolean`):

When enabled, open each property page for description, photos, agent, price history, and features. Charges the listing-details event in addition to listing. Property pages run in parallel and each uses a rotated residential proxy.

## `detailConcurrency` (type: `integer`):

How many property pages to fetch at the same time when listing details are enabled. Each request uses a new proxy session.

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

Residential proxies are recommended. Trulia may show a press-and-hold check on some IPs; the Actor rotates and retries.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.trulia.com/for_sale/Austin,TX/"
    }
  ],
  "searchQueries": [
    "Austin, TX"
  ],
  "searchType": "FOR_SALE",
  "maxListings": 10,
  "includeListingDetails": false,
  "detailConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset containing scraped Trulia listings

## `runStats` (type: `string`):

Record counts and timestamps for this run

# 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 = {
    "startUrls": [
        {
            "url": "https://www.trulia.com/for_sale/Austin,TX/"
        }
    ],
    "searchQueries": [
        "Austin, TX"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/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 = {
    "startUrls": [{ "url": "https://www.trulia.com/for_sale/Austin,TX/" }],
    "searchQueries": ["Austin, TX"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/trulia-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 '{
  "startUrls": [
    {
      "url": "https://www.trulia.com/for_sale/Austin,TX/"
    }
  ],
  "searchQueries": [
    "Austin, TX"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scraptivo/trulia-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scraptivo/trulia-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/pjSTuQFWplna47PYc/builds/cG7sHxUPLZ5NeWlsQ/openapi.json
