Trulia Scraper icon

Trulia Scraper

Scrape Trulia.com property listings by location, filters, or URL. Extract prices, beds, baths, square footage, addresses, GPS coordinates, photos,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Trulia Scraper at a glance

Trulia Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, url, change type (incremental mode), type and property, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.60 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Real Estate, Developer Tools, Automation
Pricing
$2.20 per 1,000 results (Free plan), from $1.60 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
24 options

Scrape Trulia.com property listings by location, filters, or URL. Extract prices, beds, baths, square footage, addresses, GPS coordinates, photos, agents, and brokers, plus detailed price and tax history, property features, and open house information.

What Trulia Scraper can do

  • Rich cards out of the box. Search results already carry price, beds, baths, size, full address, neighborhood, GPS coordinates, photo gallery, status tags and the listing agent and broker name, with no extra fetch needed.
  • Optional deep detail. One toggle adds price history, tax history, the full feature list, open houses, agent and broker contact, local protections, affordability data and estimated rent from the property page.
  • Three listing channels. For sale, for rent, and recently sold, all from the same search fields.
  • Real keyword filter. Narrow a location to listings whose text mentions a term such as pool, waterfront or garage.
  • Two ways to start. Build a search from simple fields, or paste Trulia search and property links you already have, with automatic pagination on search links.
  • Predictable runs. Detail mode is off by default so a standard run stays fast and low cost, and Max items keeps every run's size and spend capped.

Choose what to collect

These inputs let you configure Trulia Scraper - Property Listings, Prices, Agents & History. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredHow to start. 'Search by location' builds Trulia search URLs from the filters below. 'Direct URLs' takes Trulia search or property URLs you already have.

Choices: search, url

searchLocationstringSearch mode only. A US location such as 'Austin, TX', 'Austin TX', Austin,TX or New_York,NY. Spaces are converted automatically; a location that matches nothing fails loudly.
searchListingTypestringSearch mode only. For sale, for rent, or recently sold listings.

Choices: FOR_SALE, FOR_RENT, SOLD

searchKeywordstringSearch mode only. Narrows results to listings whose text mentions this keyword (e.g. pool, waterfront, garage). Leave empty for no keyword filter.
searchSortstringSearch mode only. Result ordering. Newest is currently served in the recommended order because the site no longer offers a newest-first order; use incremental mode to catch new listings. Trulia may place a few promoted listings ahead of the chosen order.

Choices: RECOMMENDED, NEWEST, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW

minBedsintegerSearch mode only. Keep listings with at least this many bedrooms (1-5). Leave empty for any.
minBathsintegerSearch mode only. Keep listings with at least this many bathrooms (1-4). Trulia applies this filter on its side and counts half-baths, so a listing with one and a half baths can appear under 2 or more. Works with or without Minimum bedrooms. Leave empty for any.
Show 17 more inputs
More input fields
InputWhat it controls
propertyTypestringSearch mode only. Restrict to one property type. Leave empty for all.

Choices: SINGLE_FAMILY, CONDO, TOWNHOUSE, MULTI_FAMILY, LAND, MOBILE_MANUFACTURED

searchZipstringSearch mode only. 5-digit US ZIP code. When set it replaces the location field.
startUrlsarrayURL mode only. Trulia search URLs (for sale, for rent, sold, state/city, neighborhood, ZIP, filtered, sorted, paginated, m.trulia.com) or property pages (/home/, /p/, /building/). Paginated automatically; property URLs return one record each. Left untouched, URL mode scrapes these 17 example URLs.
maxItemsintegerMaximum number of listings to scrape across all searches/URLs. This is the run cap. Set 0 for unlimited.
maxPagesintegerOptional safety cap on search pages to walk per location/URL (40 listings per page). Leave empty to walk every result page; the run stops at Max items.
resumeFromRunIdstringPaste a previous run ID (or dataset ID) from this actor to continue a large crawl without returning or charging for listings already collected there. Use this after an interrupted run. For recurring daily monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. UPDATED means any field of the stored listing record changed (price, status, description, photos, agent, tags and so on); the only things never compared are the relative "last checked ... ago" text and the MLS refresh stamp inside the listing source, plus any field you list in Ignore fields. Use What counts as a change to compare price and status only. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately per location/URL, listing type, keyword, sort, and fetchDetails setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the location/URLs, listing type, keyword, sort, and fetchDetails settings -- different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED, once a run has fully scanned the search (not capped, not a resume). Adds and bills extra synthetic rows, so leave it off unless you need expiry tracking.
changeScopestringAll fields (default): any change to the listing record, except the always-ignored relative-time text inside the listing source ("last checked ... ago") and the MLS refresh stamp, returns an UPDATED row. Price and status only: only a change to price, formatted price, price type, currency, listing type, current status (active, pending, sold, off market) or the price-change block returns an UPDATED row; descriptions, photos, tags, agent details and other fields never do. Changing this option on a search with no State key continues from that search's saved baseline instead of starting over.

Choices: all, priceAndStock

compactUpdatesbooleanOff by default. When on, UPDATED rows (and EXPIRED rows) are short: listing id, url, location, current price and status, plus priceChanges (old and new value of each moved price or status field) and variantChanges (per-unit changes when a listing carries units). NEW rows always carry the complete record. The Fetch details enrichment charge does not apply to a compact row because it no longer carries the detail data.
expireAfterMissedScansintegerOnly used with Emit expired listings. A listing is marked EXPIRED only after it has been missing from this many complete scans in a row (default 1). Raise it (for example 3) so a listing that briefly drops out of the results is not reported as gone. A listing that comes back resets the count. EXPIRED means the listing was no longer found in the results; it does not prove the property was delisted, so check the status fields for availability.
ignoreFieldsForChangesarrayOptional. Field names to exclude from UPDATED change detection and from changedFields, in addition to the built-in handling (the relative "last checked" text and MLS refresh stamp already never trigger an UPDATED). Use this if a field in your setup turns out to be noisy. Nested fields use dotted names, for example provider.logoUrl or homeDetails.activeListing.provider. The fields stay in the output rows; they just do not decide UPDATED.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (address + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID
urlURL (link)
changeTypeChange type (incremental mode) (text)
listingTypeType
propertyTypeProperty
pricePrice
formattedPricePrice (display)
streetAddressAddress
cityCity
stateState
zipCodeZIP
neighborhoodNeighborhood
Show 20 more fields
latitudeLat
longitudeLng
bedroomsBeds
bathroomsBaths
floorSpaceSize
listingAgentNameAgent
brokerNameBroker
heroImagePhoto (image)
detailFetchedEnriched
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
scrapedAtScraped at (date)
descriptionDescription
priceHistoryPrice history (array)
taxesTaxes (object)
featuresFeatures (object)
providerDetailsAgent / broker (object)
homeDetailsHome details (object)
openHousesOpen houses (array)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "id": "00000001",
  "url": "https://www.trulia.com/home/sample-address-ny-10000-00000001",
  "listingType": "FOR_SALE",
  "propertyType": "SINGLE_FAMILY_HOME",
  "price": 750000,
  "formattedPrice": "$750,000",
  "streetAddress": "123 Sample Street",
  "city": "Sampletown",
  "state": "NY",
  "zipCode": "10000",
  "neighborhood": "Sample Heights",
  "latitude": 40,
  "longitude": -73,
  "bedrooms": 3,
  "bathrooms": 2,
  "floorSpace": "1,800 sqft",
  "lotSize": "0.25 acres",
  "listingAgentName": "Agent Name",
  "brokerName": "Sample Realty",
  "heroImage": "https://www.trulia.com/pictures/thumbs_4/sample/00000000-full.jpg",
  "photos": [
    "https://www.trulia.com/pictures/thumbs_6/sample/00000000-full.jpg"
  ],
  "tags": [
    "NEW"
  ],
  "dateListed": "2026-01-01",
  "description": "Sample listing description.",
  "scrapedAt": "2026-01-01T00:00:00.000Z"
}

Ways to use this data

  • Real estate investors and flippers: track new listings and price drops for sale in target neighborhoods.
  • Rental market research: collect current for-rent inventory and pricing across a metro area or ZIP code.
  • Market analysts and appraisers: build historical comps from recently sold listings, including price and sale history.
  • PropTech and data teams: feed a normalized property dataset into an internal tool, model or dashboard.
  • Relocation and lead-generation sites: enrich listing pages with fresh price, photo and agent contact data.
  • Agents and brokers: monitor a search for new listings or status changes and get only the changes on a schedule.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Trulia Scraper return?

The documented output for Trulia Scraper includes id, url, change type (incremental mode), type, property, price, price (display) and address. Availability of each field depends on the source page and the selected mode.

How much does Trulia Scraper cost?

It costs $2.20 per 1,000 results on the Apify Free plan and from $1.60 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab with the same search or URL input and turn on Incremental mode. Each run then returns only new, updated and reappeared listings, and unchanged ones are not billed.

Why did my run return fewer listings than I expected?

The most common reason is Max items: raise it, or set it to 0 for unlimited, to walk every available result page. Max pages is a separate, optional cap on pages per search or URL; leave it empty to remove it. A search or keyword that is genuinely narrow can also just have few results on Trulia itself.

Why is a listing sometimes missing even though it is on Trulia?

Two common causes. First, the selected connection may be refused by the site on some exits; try again or select Apify Residential (US). Second, in URL mode with several overlapping URLs, when one URL's share of Max items ends partway through a results page, the uncollected listings on that page are still treated as already seen for the rest of the run. If another URL in the same run reaches one of them, it is skipped without a warning rather than returned. Set Max items to 0 and use Max pages as the bound, or run overlapping URLs as separate runs, to avoid it. A run continued after a platform migration or Resurrect can also miss a few listings from the page in progress at that moment; a follow-up run with Resume pointed at it collects them.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with Trulia Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.