# Trulia Scraper (Cheap) (`data_api/trulia-scraper-cheap`) Actor

Trulia property scraper that pulls listing data from city search pages, returning addresses, prices, bed/bath counts, photos, and open house dates as JSON.

- **URL**: https://apify.com/data\_api/trulia-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

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/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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 Property Scraper

![Trulia Property Scraper](cover.jpg)

Trulia keeps its listings locked behind an infinite-scroll search page and no download button, so copying out addresses and prices by hand falls apart the moment you need more than a handful. Paste a city or neighborhood search URL and this scraper reads the listings straight off the page: the street address, the asking price both as a number and as Trulia prints it, beds, baths, floor area, property type, GPS coordinates, photos, open house times, and the listing link. Give it one city or a stack of them and let it page through automatically.

### What you get

Every listing comes back as one row with the same shape, so the columns line up cleanly when you load the results into a sheet or database. The fields break down into a few groups:

- **Location** — `propertyAddress`, `cityName`, `stateAbbr`, `postalCode`, `fullLocation`, plus `geoLat` and `geoLng`
- **Price** — `askingPrice` as a number, `priceLabel` as printed, and `priceCurrency`
- **Property details** — `bedroomCount`, `bathroomCount`, `floorArea`, `lotArea`, `homeType`
- **Status** — `forSale`, `forRent`, `recentlySold`, `offMarket`, `foreclosure`, and `statusLabels`
- **Media and context** — `coverPhoto`, `photoLinks`, `listingSummary`, `listedDate`, `openHouseSlots`, `detailUrl`, `searchSource`, `collectedAt`

### Quick start

1. Press **Try for free** and open the input form.
2. Paste one or more Trulia search URLs into **Trulia search pages** (city or neighborhood pages work).
3. Set **Listings per search page** to cap how many homes you pull from each URL.
4. Press **Start**, then export your results as JSON, CSV, Excel, or XML when the run finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Market research** — pull asking prices across cities and feed them into a pricing model to flag homes that look underpriced.
- **Daily monitoring** — snapshot a target city each day, diff against yesterday, and catch new listings the moment they post.
- **Image datasets** — grab `photoLinks` to download listing photos for computer vision work or training data.
- **Mapping** — pair `geoLat` and `geoLng` with mapping tools to see where listings cluster by neighborhood.
- **Open house planning** — collect `openHouseSlots` across several cities and roll them into one weekend calendar for buyers.
- **Lead lists for agents** — filter by `homeType` and price to build a focused list of properties worth a call.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchPageUrls` | array of strings | Yes | Trulia city or neighborhood search URLs. Each one is paged through on its own. |
| `resultsLimit` | integer | No | How many listings to gather per search URL (Trulia shows about 40 per page). Default `50`. |
| `timeoutSeconds` | integer | No | Seconds to wait on a request before giving up. Default `90`; raise it on slow connections. |

#### Example input

```json
{
  "searchPageUrls": [
    "https://www.trulia.com/CA/San_Diego/",
    "https://www.trulia.com/FL/Tampa/"
  ],
  "resultsLimit": 50,
  "timeoutSeconds": 90
}
````

### Output

Each listing becomes one row, and every field above is present on every row — values Trulia does not show come back as `null` so your dataset stays rectangular.

#### Example output

```json
{
  "propertyAddress": "1212 Guadalupe St #704",
  "cityName": "Austin",
  "stateAbbr": "TX",
  "postalCode": "78701",
  "fullLocation": "1212 Guadalupe St #704, Austin, TX 78701",
  "geoLat": 30.275978,
  "geoLng": -97.744095,
  "askingPrice": 325000,
  "priceLabel": "$325,000",
  "priceCurrency": "USD",
  "bedroomCount": 1,
  "bathroomCount": 1,
  "floorArea": "469 sqft",
  "lotArea": null,
  "homeType": "CONDO",
  "forSale": true,
  "forRent": false,
  "recentlySold": false,
  "offMarket": false,
  "foreclosure": false,
  "detailUrl": "https://www.trulia.com/home/1212-guadalupe-st-704-austin-tx-78701-29387349",
  "coverPhoto": "https://www.trulia.com/pictures/thumbs_4/zillowstatic/fp/2bfd9f420ad909ab93654a0ee041166b-full.jpg",
  "photoLinks": [
    "https://www.trulia.com/pictures/thumbs_4/zillowstatic/fp/2bfd9f420ad909ab93654a0ee041166b-full.jpg",
    "https://www.trulia.com/pictures/thumbs_4/zillowstatic/fp/42c1afb36db27101c435739b4b06b246-full.jpg"
  ],
  "statusLabels": ["NEW - 2 MIN AGO"],
  "listingSummary": "This condo is located at 1212 Guadalupe St #704, Austin, TX 78701...",
  "listedDate": null,
  "openHouseSlots": [
    {
      "date": "Saturday, June 14",
      "startHour": "2PM",
      "endHour": "4PM"
    }
  ],
  "searchSource": "https://www.trulia.com/TX/Austin/",
  "collectedAt": "2026-06-29T10:00:00+00:00"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `propertyAddress` | string | Street line of the home (e.g. "1212 Guadalupe St #704") |
| `cityName` | string | City the listing sits in |
| `stateAbbr` | string | Two-letter state code (e.g. "TX") |
| `postalCode` | string | ZIP code |
| `fullLocation` | string | Whole address on one line |
| `geoLat` | number | Map latitude |
| `geoLng` | number | Map longitude |
| `askingPrice` | integer | List price in USD as a plain number |
| `priceLabel` | string | Price as Trulia prints it (e.g. "$325,000") |
| `priceCurrency` | string | Currency code attached to the price (USD) |
| `bedroomCount` | integer | Number of bedrooms |
| `bathroomCount` | number | Number of bathrooms, may be a half value such as 1.5 |
| `floorArea` | string | Indoor living space as printed (e.g. "1,200 sqft") |
| `lotArea` | string | Lot size, or null when not stated |
| `homeType` | string | CONDO, SINGLE\_FAMILY, TOWNHOUSE, MULTI\_FAMILY, LAND, and similar |
| `forSale` | boolean | True when listed for sale |
| `forRent` | boolean | True when listed for rent |
| `recentlySold` | boolean | True when sold not long ago |
| `offMarket` | boolean | True when no longer on the market |
| `foreclosure` | boolean | True when a foreclosure listing |
| `detailUrl` | string | Direct link to the full listing on Trulia |
| `coverPhoto` | string | Main listing photo URL |
| `photoLinks` | array | Every photo URL for the listing |
| `statusLabels` | array | Card badges such as "NEW - 2 MIN AGO" or "OPEN SAT" |
| `listingSummary` | string | Full marketing description text |
| `listedDate` | string | Date first listed, when available |
| `openHouseSlots` | array | Scheduled open houses (date, startHour, endHour) |
| `searchSource` | string | The search URL this listing came from |
| `collectedAt` | string | ISO 8601 timestamp of when the row was captured |

### Tips for best results

- **Start with one city.** Run a single URL with a low `resultsLimit` first to confirm the output fits your pipeline, then scale up.
- **Scrape rentals** by passing a Trulia rental search URL, for example `https://www.trulia.com/for_rent/Austin,TX/`.
- **Scrape foreclosures** with Trulia's foreclosure search URLs, such as `https://www.trulia.com/TX/Austin/FORECLOSURE/`.
- **Push `resultsLimit` toward 1000** to grab the largest sample a city offers in one run.
- **Lean on `statusLabels`** for freshness — labels like "NEW - 2 MIN AGO" or "OPEN SUN" reflect what the card showed at scrape time.
- **Check `searchSource`** when you run several cities at once; it tells you which URL produced each row.
- **Raise `timeoutSeconds`** to around 120 if pages are timing out on a slow connection.

### How can I use Trulia property data?

**How can I use the Trulia Property Scraper to build a housing market dataset?**
Paste the search URLs for the cities you care about and the scraper returns every listing's address, asking price, beds, baths, and floor area as clean rows. Group them by `cityName` or `postalCode` to compare price per square foot, track inventory, and spot where homes are sitting on the market.

**How can I pull Trulia listings for a single neighborhood without copying them by hand?**
Drop in one neighborhood search URL and set `resultsLimit` to the number of homes you want. The scraper pages through the results for you and hands back each listing with its full address, GPS coordinates, photos, and listing link — no scrolling, no copy and paste.

**How can I track new Trulia listings and price changes over time?**
Run the same search URL on a schedule and keep each run's output. Because every row carries `collectedAt` and a stable `detailUrl`, you can diff today's pull against yesterday's to surface fresh listings, price cuts, and homes that just went off market.

**How can I export Trulia property data to Excel or Google Sheets?**
After a run finishes, use Apify's export options to download the dataset as CSV, Excel, JSON, or XML, or pull it through the API. Every listing is one flat row, so it lands in a spreadsheet ready to filter, sort, and chart.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

## `searchUrls` (type: `array`):

One or more Trulia city or neighborhood search URLs (e.g. https://www.trulia.com/TX/Austin/). Each URL is scraped independently up to the Max items limit.

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

Maximum number of listings to collect per search URL. Each page contains up to 40 listings.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds. Increase if pages time out on slower connections.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.trulia.com/TX/Austin/",
    "https://www.trulia.com/CA/Los_Angeles/"
  ],
  "maxItems": 30,
  "requestTimeoutSecs": 60
}
```

# 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 = {
    "searchUrls": [
        "https://www.trulia.com/TX/Austin/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/trulia-scraper-cheap").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 = { "searchUrls": ["https://www.trulia.com/TX/Austin/"] }

# Run the Actor and wait for it to finish
run = client.actor("data_api/trulia-scraper-cheap").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 '{
  "searchUrls": [
    "https://www.trulia.com/TX/Austin/"
  ]
}' |
apify call data_api/trulia-scraper-cheap --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Trulia Scraper (Cheap)",
        "description": "Trulia property scraper that pulls listing data from city search pages, returning addresses, prices, bed/bath counts, photos, and open house dates as JSON.",
        "version": "0.0",
        "x-build-id": "EaAhcZMYcUt7cRudZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/data_api~trulia-scraper-cheap/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-data_api-trulia-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/data_api~trulia-scraper-cheap/runs": {
            "post": {
                "operationId": "runs-sync-data_api-trulia-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/data_api~trulia-scraper-cheap/run-sync": {
            "post": {
                "operationId": "run-sync-data_api-trulia-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchUrls": {
                        "title": "Search URLs",
                        "type": "array",
                        "description": "One or more Trulia city or neighborhood search URLs (e.g. https://www.trulia.com/TX/Austin/). Each URL is scraped independently up to the Max items limit.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max items per URL",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of listings to collect per search URL. Each page contains up to 40 listings.",
                        "default": 30
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 10,
                        "maximum": 180,
                        "type": "integer",
                        "description": "Per-request timeout in seconds. Increase if pages time out on slower connections.",
                        "default": 60
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
