# Trulia Property Extractor (`kawsar/trulia-property-extractor`) 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/kawsar/trulia-property-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.90 / 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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 extractor

A Trulia scraper that pulls real estate listings from city and neighborhood search pages. Returns structured JSON with addresses, prices, bed/bath counts, square footage, property type, GPS coordinates, listing photos, open house schedules, and more.

Pass one or more Trulia search URLs and the actor pages through results automatically. Each URL is scraped independently up to your configured item limit, so two cities at 200 items each gives you up to 400 listings in one run.

---

### What you get

For every listing the actor returns:

- Full property address with city, state, ZIP, and GPS coordinates
- Asking price as both an integer and formatted string
- Bedroom count, bathroom count, floor area, and lot size
- Property type: single family, condo, townhouse, multi-family, land, etc.
- Listing status: active for sale, active for rent, recently sold, off-market, or foreclosure
- Primary listing photo and all available photo URLs
- Full property description text
- Date first listed
- Scheduled open houses with date, start time, and end time
- Listing URL on Trulia

---

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchUrls` | String list | Required | One or more Trulia city or neighborhood search URLs |
| `maxItems` | Integer | 100 | Max listings per search URL (up to 1,000) |
| `requestTimeoutSecs` | Integer | 30 | Per-request timeout in seconds |

`maxItems` applies per URL independently. With two URLs and `maxItems: 200`, the actor collects up to 400 listings total.

**Example — single city:**

```json
{
  "searchUrls": ["https://www.trulia.com/TX/Austin/"],
  "maxItems": 200
}
````

**Example — multiple cities:**

```json
{
  "searchUrls": [
    "https://www.trulia.com/TX/Austin/",
    "https://www.trulia.com/CA/Los_Angeles/",
    "https://www.trulia.com/NY/New_York/"
  ],
  "maxItems": 500
}
```

***

### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `streetAddress` | String | Street address (e.g. "1212 Guadalupe St #704") |
| `city` | String | City name |
| `stateCode` | String | 2-letter state code (e.g. "TX") |
| `zipCode` | String | ZIP code |
| `fullAddress` | String | Full formatted address |
| `latitude` | Float | GPS latitude |
| `longitude` | Float | GPS longitude |
| `price` | Integer | Price in USD |
| `formattedPrice` | String | Formatted price string (e.g. "$325,000") |
| `currencyCode` | String | Currency code (USD) |
| `bedrooms` | Integer | Bedroom count |
| `bathrooms` | Float | Bathroom count |
| `sqft` | String | Floor area (e.g. "1,200 sqft") |
| `lotSize` | String / null | Lot size, or null if not listed |
| `propertyType` | String | CONDO, SINGLE\_FAMILY, TOWNHOUSE, MULTI\_FAMILY, LAND, etc. |
| `isActiveForSale` | Boolean | True if currently listed for sale |
| `isActiveForRent` | Boolean | True if currently listed for rent |
| `isRecentlySold` | Boolean | True if recently sold |
| `isOffMarket` | Boolean | True if off-market |
| `isForeclosure` | Boolean | True if foreclosure listing |
| `listingUrl` | String | Full Trulia listing URL |
| `heroImageUrl` | String | Primary listing photo URL |
| `photoUrls` | Array | All available listing photo URLs |
| `tags` | Array | Status tags (e.g. "NEW - 2 MIN AGO", "OPEN SAT") |
| `listingDescription` | String | Full property description text |
| `dateListed` | String / null | Date first listed, when available |
| `openHouses` | Array | Scheduled open houses (date, startHour, endHour) |
| `sourceUrl` | String | The search URL this listing came from |
| `scrapedAt` | String | Scrape timestamp in ISO 8601 format |

**Example output record:**

```json
{
  "streetAddress": "1212 Guadalupe St #704",
  "city": "Austin",
  "stateCode": "TX",
  "zipCode": "78701",
  "fullAddress": "1212 Guadalupe St #704, Austin, TX 78701",
  "latitude": 30.275978,
  "longitude": -97.744095,
  "price": 325000,
  "formattedPrice": "$325,000",
  "currencyCode": "USD",
  "bedrooms": 1,
  "bathrooms": 1,
  "sqft": "469 sqft",
  "lotSize": null,
  "propertyType": "CONDO",
  "isActiveForSale": true,
  "isActiveForRent": false,
  "isRecentlySold": false,
  "isOffMarket": false,
  "isForeclosure": false,
  "listingUrl": "https://www.trulia.com/home/1212-guadalupe-st-704-austin-tx-78701-29387349",
  "heroImageUrl": "https://www.trulia.com/pictures/thumbs_4/zillowstatic/fp/2bfd9f420ad909ab93654a0ee041166b-full.jpg",
  "photoUrls": [
    "https://www.trulia.com/pictures/thumbs_4/zillowstatic/fp/2bfd9f420ad909ab93654a0ee041166b-full.jpg",
    "https://www.trulia.com/pictures/thumbs_4/zillowstatic/fp/42c1afb36db27101c435739b4b06b246-full.jpg"
  ],
  "tags": ["NEW - 2 MIN AGO"],
  "listingDescription": "This condo is located at 1212 Guadalupe St #704, Austin, TX 78701...",
  "dateListed": null,
  "openHouses": [
    {
      "date": "Saturday, June 14",
      "startHour": "2PM",
      "endHour": "4PM"
    }
  ],
  "sourceUrl": "https://www.trulia.com/TX/Austin/",
  "scrapedAt": "2026-06-11T10:00:00+00:00"
}
```

***

### Search URL formats

The actor accepts Trulia city-level and neighborhood search pages. The URL pattern is:

```
https://www.trulia.com/{STATE_CODE}/{CITY_NAME}/
```

State codes are 2-letter abbreviations. City names use underscores for spaces.

| Market | URL |
|--------|-----|
| Austin, TX | `https://www.trulia.com/TX/Austin/` |
| Los Angeles, CA | `https://www.trulia.com/CA/Los_Angeles/` |
| New York, NY | `https://www.trulia.com/NY/New_York/` |
| Seattle, WA | `https://www.trulia.com/WA/Seattle/` |
| Miami, FL | `https://www.trulia.com/FL/Miami/` |
| Chicago, IL | `https://www.trulia.com/IL/Chicago/` |
| Houston, TX | `https://www.trulia.com/TX/Houston/` |
| Phoenix, AZ | `https://www.trulia.com/AZ/Phoenix/` |
| Denver, CO | `https://www.trulia.com/CO/Denver/` |
| Nashville, TN | `https://www.trulia.com/TN/Nashville/` |

The actor normalizes URLs automatically. You can omit `https://`, `www.`, or the trailing slash and it will still work.

Individual property listing URLs (e.g. `/home/...`) are not supported.

***

### Pagination

Trulia shows up to 40 listings per page. The actor fetches pages in order until it hits your `maxItems` limit or runs out of listings for that URL. There is no separate page limit to configure.

With `maxItems: 200`, the actor fetches 5 pages (40 listings each) per URL. With a city that has only 75 listings, it stops after 2 pages.

***

### Tips

- To scrape rentals, use Trulia rental search URLs (e.g. `https://www.trulia.com/for_rent/Austin,TX/`).
- To scrape foreclosures, use Trulia's foreclosure search URLs (e.g. `https://www.trulia.com/TX/Austin/FORECLOSURE/`).
- Set `maxItems` to 1000 to collect the largest available sample from a city in one run.
- The `tags` field shows time-sensitive labels like "NEW - 2 MIN AGO" or "OPEN SUN" that reflect listing freshness at scrape time.
- The `sourceUrl` field on each record tells you which search URL produced it, useful when scraping multiple cities.

***

### Use cases

- Collect asking prices across cities and run them through a pricing model to flag undervalued properties.
- Pull daily snapshots of a target city, compare with previous runs, and alert on new listings.
- Filter `photoUrls` to download listing images for computer vision or training datasets.
- Combine `latitude` and `longitude` with mapping tools to visualize listing density by neighborhood.
- Extract `openHouses` across multiple cities to build a weekly open house calendar for buyers.

# 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("kawsar/trulia-property-extractor").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("kawsar/trulia-property-extractor").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 kawsar/trulia-property-extractor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Trulia Property Extractor",
        "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": "1L87H8ayTSAqtsHeN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kawsar~trulia-property-extractor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kawsar-trulia-property-extractor",
                "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/kawsar~trulia-property-extractor/runs": {
            "post": {
                "operationId": "runs-sync-kawsar-trulia-property-extractor",
                "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/kawsar~trulia-property-extractor/run-sync": {
            "post": {
                "operationId": "run-sync-kawsar-trulia-property-extractor",
                "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
