# Trulia Listings & Price History Scraper (`vexaloom-labs/trulia-listings-and-price-history-scraper`) Actor

Scrape property listings from Trulia - for sale, for rent, and sold. Supports search pages and direct property URLs. No login required.

- **URL**: https://apify.com/vexaloom-labs/trulia-listings-and-price-history-scraper.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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

## Trulia Search, Listings & Price History Scraper

Turn Trulia into a structured housing dataset. Search any U.S. market with price, bedroom, bathroom, square-footage, and property-type filters — or paste Trulia search, property, and rental-community URLs — and get one clean record per listing, with optional price history, tax history, open houses, and agent contact details.

### Two ways to run it

- **Search by location and filters** — give a city, ZIP, or neighborhood, choose for-sale, for-rent, or sold, and narrow by price, beds, baths, size, and property type. The actor paginates the search for you.
- **Scrape specific Trulia URLs** — paste one or more search pages, property pages, or rental-community pages. Any filter already applied in a Trulia search URL is preserved.

Both modes can be used in the same run.

### What you can collect

- **Listing basics** — price (and price range for communities), formatted price, currency, address, city, state, ZIP, county, neighborhood, latitude, longitude
- **Property facts** — beds, baths, square feet, lot size, year built, HOA fee, price per square foot, property type, community name
- **Status** — for sale, for rent, recently sold, off-market, new listing and open-house tags
- **History** — complete price history (listed, price change, pending, sold, removed) and county tax assessments
- **Contact and attribution** — listing agent, agent phone, brokerage, MLS number, MLS attribution
- **Rentals** — price ranges, pet policy, required monthly and one-time fees
- **Media** — listing photo URLs and photo count
- **Optional detail fields** — full description, features grouped by room/system, scheduled open houses, estimated value, sold date and sold price

Every record is omit-empty: a field appears only when Trulia published a real value for that listing. No `null`, blank-string, or sentinel values are written.

### Input

| Field | Default | What it does |
|---|---|---|
| `mode` | `search` | `search` uses the filters below; `urls` scrapes the URLs you paste |
| `location` | – | City and state (`Austin, TX`), ZIP (`78704`), or neighborhood |
| `listingType` | `for_sale` | `for_sale`, `for_rent`, or `sold` |
| `propertyType` | `any` | Any, single-family, condo, townhouse, multi-family, apartment, co-op, land, mobile/manufactured |
| `minPrice` / `maxPrice` | – | Price range in USD |
| `minBeds` / `maxBeds` | – | Bedroom range |
| `minBaths` / `maxBaths` | – | Bathroom range |
| `minSqft` / `maxSqft` | – | Living-area range in square feet |
| `maxItems` | `40` | Total listing cap across all inputs (1–10,000) |
| `fetchDetails` | `false` | Open each listing page for price history, tax history, features, open houses, and agent phone |
| `urls` | – | Trulia search, property, or rental-community URLs used in URL mode |
| `proxyConfiguration` | automatic | Optional. The actor tries a direct connection first and falls back to an Apify proxy automatically |

#### Example: Austin homes under $700K, 3+ beds

```json
{
  "mode": "search",
  "location": "Austin, TX",
  "listingType": "for_sale",
  "maxPrice": 700000,
  "minBeds": 3,
  "maxItems": 100,
  "fetchDetails": true
}
```

#### Example: sold comps in one ZIP

```json
{
  "mode": "search",
  "location": "78704",
  "listingType": "sold",
  "maxItems": 50,
  "fetchDetails": true
}
```

#### Example: paste Trulia URLs

```json
{
  "mode": "urls",
  "urls": [
    "https://www.trulia.com/for_rent/Austin,TX/2p_beds/",
    "https://www.trulia.com/home/1801-w-saint-johns-st-austin-tx-78757-464681422"
  ],
  "maxItems": 20,
  "fetchDetails": true
}
```

### Output example

```json
{
  "url": "https://www.trulia.com/home/1801-w-saint-johns-st-austin-tx-78757-464681422",
  "listingType": "for_sale",
  "listingStatus": "For Sale",
  "propertyType": "Single Family Home",
  "price": 1449000,
  "priceLabel": "$1,449,000",
  "priceCurrency": "USD",
  "address": "1801 W  Saint Johns St",
  "city": "Austin",
  "state": "TX",
  "zipCode": "78757",
  "neighborhood": "Crestview",
  "latitude": 30.344343,
  "longitude": -97.7303,
  "bedrooms": 4,
  "bathrooms": 4.5,
  "sqft": 2534,
  "yearBuilt": 2026,
  "pricePerSqft": "$572",
  "agentName": "Darsh Parikh",
  "agentPhone": "(512) 593-3138",
  "brokerName": "Compass RE Texas, LLC",
  "mlsId": "5501580",
  "priceHistory": [
    {
      "date": "2026-11-11T00:00:00+00:00",
      "price": 1449000,
      "priceLabel": "$1,449,000",
      "event": "Listed For Sale",
      "source": "Unlock MLS #5501580"
    }
  ],
  "openHouses": [
    {
      "startTime": "2026-11-12T21:00:00+00:00",
      "date": "Thursday, November 12"
    }
  ],
  "scrapedAt": "2026-11-11T07:24:01+00:00"
}
```

### Use cases

- **Comparable sales** — collect recently sold homes and their price history for valuation work
- **Market monitoring** — schedule a ZIP or neighborhood search and diff price, status, and days on market
- **Rental benchmarking** — pull asking rents, pet policies, and required fees across a metro
- **Investor screening** — filter by price, size, and property type, then enrich each candidate with tax and HOA data
- **Agent and brokerage tracking** — see which agents and MLSs list in a market

### FAQ

**Do I need a Trulia or Zillow account?**
No. The actor reads the public pages Trulia serves without a login.

**Do I need to configure a proxy?**
No. It tries a direct connection first and switches to an Apify proxy only if Trulia blocks the request. You do not need to supply proxy credentials.

**How many listings can one search return?**
Trulia exposes up to 25 result pages per search — about 1,000 listings. For a larger market, split the work by ZIP code, price band, bedroom count, or property type, then combine the datasets.

**Why are some sold prices missing?**
Some counties and MLSs suppress the recorded sale price. The sold date and the price-history timeline are still returned when Trulia publishes them.

**Why do rental communities show a price range instead of one price?**
A community page represents multiple floor plans. `priceMin` and `priceMax` carry the range and `price` is set to the lower bound.

**Can I get school ratings or neighborhood demographics?**
Not in this actor. Trulia shows school names and local survey summaries on some pages, but the reliable public dataset is listing, price, tax, and property data.

**What happens to invalid URLs?**
They produce a record with `inputUrl`, `error`, and `scrapedAt` so one bad URL does not lose the rest of the run.

### Notes

Use the actor for public, lawful research. Respect Trulia's terms, robots policy, and applicable law when scheduling runs or redistributing data.

# Actor input Schema

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

Search by location using the filters below, or paste Trulia URLs.

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

City and state, ZIP code, or neighborhood. Examples: Austin, TX · 78704 · New York, NY.

## `listingType` (type: `string`):

Search for-sale homes, rentals, or recently sold homes.

## `propertyType` (type: `string`):

Restrict results to one property type.

## `minPrice` (type: `integer`):

Lowest listing price to include.

## `maxPrice` (type: `integer`):

Highest listing price to include.

## `minBeds` (type: `integer`):

Smallest number of bedrooms to include.

## `maxBeds` (type: `integer`):

Largest number of bedrooms to include.

## `minBaths` (type: `integer`):

Smallest number of bathrooms to include.

## `maxBaths` (type: `integer`):

Largest number of bathrooms to include.

## `minSqft` (type: `integer`):

Smallest living area to include.

## `maxSqft` (type: `integer`):

Largest living area to include.

## `maxItems` (type: `integer`):

Maximum number of listing records to collect across all URLs.

## `fetchDetails` (type: `boolean`):

Open each listing page to add price history, tax history, full features, open houses, and agent phone.

## `urls` (type: `array`):

Trulia search pages, property pages, or rental-community pages. Existing filters in a search URL are preserved.

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

Leave the default for automatic proxy selection. Trulia's PerimeterX protects some routes, and the actor falls back to an Apify proxy only when a direct request is blocked.

## Actor input object example

```json
{
  "mode": "search",
  "location": "Austin, TX",
  "listingType": "for_sale",
  "propertyType": "any",
  "maxItems": 3,
  "fetchDetails": false,
  "urls": []
}
```

# Actor output Schema

## `listings` (type: `string`):

Dataset containing all scraped Trulia listings and property records.

# 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 = {
    "mode": "search",
    "location": "Austin, TX",
    "listingType": "for_sale",
    "propertyType": "any",
    "maxItems": 3,
    "fetchDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/trulia-listings-and-price-history-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 = {
    "mode": "search",
    "location": "Austin, TX",
    "listingType": "for_sale",
    "propertyType": "any",
    "maxItems": 3,
    "fetchDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/trulia-listings-and-price-history-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 '{
  "mode": "search",
  "location": "Austin, TX",
  "listingType": "for_sale",
  "propertyType": "any",
  "maxItems": 3,
  "fetchDetails": false
}' |
apify call vexaloom-labs/trulia-listings-and-price-history-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/trulia-listings-and-price-history-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/WfnnIhpImgHWx0afZ/builds/0hDIgRrHOifzPcYCD/openapi.json
