# Realtor Search Scraper (Cheap) (`data_api/realtor-search-scraper-cheap`) Actor

Property scraper that extracts Realtor.com listings, prices, and agent details so investors and agents can analyze market data and find deals affordably.

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

## Pricing

from $1.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.

- **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

## Realtor.com Search Scraper

![Realtor.com Search Scraper](cover.jpg)

Pulling homes off Realtor.com by hand means clicking through pages of search results and copying price, beds, address, and agent into a sheet one card at a time. This scraper does it for you. Set your filters, press start, and every matching home comes back as a clean row with price, location, size, status, photos, and agent already split into fields. It's fast and code-free, and you only pay for the listings you actually pull.

### What you get

Each home in the search comes back as one row, grouped into a few kinds of data:

- **Identity and link** — `propertyId`, `mlsListingId`, `listingPath`, `listingStatus`
- **Price and dates** — `askingPrice`, `soldPrice`, `priceCutAmount`, `listedDate`, `soldDate`
- **Home details** — `homeType`, `homeSubType`, `bedroomCount`, `bathLabel`, `interiorSqft`, `lotSqft`, `yearBuilt`, `garageSpaces`
- **Location** — `streetAddress`, `cityName`, `stateName`, `stateCode`, `zipCode`, `lat`, `lng`, `countyName`, `countyFips`, `streetViewLink`
- **Media** — `coverPhoto`, `photoCount`, `photoLinks`, `hasMatterport`
- **Market flags** — `comingSoon`, `freshListing`, `priceDropped`, `foreclosure`, `newBuild`, `pending`, `contingent`, `auction`, `fractionalOwnership`
- **Agent and source** — `primaryAgentName`, `primaryAgentEmail`, `primaryAgentOffice`, `primaryAgentPhones`, `secondaryAgentName`, `brandingName`, `sourceName`, `openHouses`, `collectedAt`

### Quick start

1. Decide what you want: a market state (`listingStatuses` such as `for_sale` or `sold`) plus a location (`zipCode`, `cityName`, `stateCode`, or `addressLine`).
2. Add any extra filters you need, like price range, bedroom count, home type, or amenity keywords.
3. Set a **Total listings cap** so you control how many homes you pull and what you spend.
4. Press **Start**, then export the rows as JSON, CSV, Excel, or XML.

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

### Use cases

- **Comparable sales research** — pull recent `sold` homes in a ZIP to price a listing or an offer
- **Lead lists for agents** — gather active homes plus agent names and offices in a target city
- **Investment sourcing** — filter for foreclosures, price drops, or new construction across a state
- **Rental hunting** — pull `for_rent` homes that allow cats or dogs in one neighborhood
- **Market dashboards** — feed live Realtor.com data into your own sheet, BI tool, or model

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `listingStatuses` | array of strings | Yes | Market states to pull, such as `for_sale`, `sold`, or `for_rent`. Prefilled with `for_sale`. |
| `zipCode` | string | No | One 5-digit US ZIP to target a single neighborhood. |
| `stateCode` | string | No | Two-letter US state, best paired with another filter. |
| `cityName` | string | No | Exact city name; pair with `stateCode` for repeated names. |
| `streetName` | string | No | Homes along one street. |
| `addressLine` | string | No | One exact address line for a single-home lookup. |
| `propertyTypes` | array of strings | No | Home categories like `single_family` or `condo`. |
| `featureKeywords` | array of strings | No | Required amenities like `pool` or `waterfront`. |
| `bedsMin` / `bedsMax` | integer | No | Bedroom floor and ceiling. |
| `bathsMin` / `bathsMax` | integer | No | Bathroom floor and ceiling. |
| `listPriceMin` / `listPriceMax` | integer | No | Asking price range in USD. |
| `soldPriceMin` / `soldPriceMax` | integer | No | Sold price range in USD; applies when `listingStatuses` includes `sold`. |
| `soldDateFrom` / `soldDateTo` | string | No | Sale date window in YYYY-MM-DD. |
| `sqftMin` / `sqftMax` | integer | No | Interior living area range in square feet. |
| `lotSqftMin` / `lotSqftMax` | integer | No | Lot size range in square feet. |
| `yearBuiltFrom` / `yearBuiltTo` | integer | No | Construction year window. |
| `hoaFeeMax` | integer | No | Highest monthly HOA fee to accept. Ignored when `noHoaFee` is on. |
| `noHoaFee` | boolean | No | Keep only homes with no HOA fee. Default `false`. |
| `openHouseFrom` / `openHouseTo` | string | No | Open house date window in YYYY-MM-DD. |
| `pendingOnly` | boolean | No | Keep only pending homes. Default `false`. |
| `contingentOnly` | boolean | No | Keep only contingent homes. Default `false`. |
| `foreclosureOnly` | boolean | No | Keep only homes in foreclosure. Default `false`. |
| `newConstructionOnly` | boolean | No | Keep only newly built homes. Default `false`. |
| `hasVirtualTour` | boolean | No | Keep only listings with a virtual tour. Default `false`. |
| `hasMatterport` | boolean | No | Keep only listings with a Matterport 3D walkthrough. Default `false`. |
| `catsAllowed` | boolean | No | Rentals that allow cats. Default `false`. |
| `dogsAllowed` | boolean | No | Rentals that allow dogs. Default `false`. |
| `sortField` | string | No | Field to order results by. Default `list_date`. |
| `sortDirection` | string | No | `desc` or `asc`. Default `desc`. |
| `agentSourceId` | string | No | Listings tied to one agent source ID. |
| `sellingAgentName` | string | No | Match by the selling agent's name. |
| `mlsListingId` | string | No | Pull one listing by its MLS ID. |
| `propertyId` | string | No | Pull one home by its Realtor.com property ID. |
| `fulfillmentId` | string | No | Listings tied to an agent fulfillment ID. |
| `pageSize` | integer | No | Listings per API call, up to 200. Default `200`. |
| `startOffset` | integer | No | Index to start from. Default `0`. |
| `resultsLimit` | integer | No | Hard cap on total listings collected. Default `1000`. |
| `timeoutSeconds` | integer | No | Whole-run timeout. Default `300`. |
| `requestTimeoutSeconds` | integer | No | Per-request timeout. Default `45`. |
| `proxyConfiguration` | object | No | Proxy settings; US datacenter is the default. |

#### Example input

```json
{
    "listingStatuses": ["sold", "for_sale"],
    "zipCode": "30301",
    "propertyTypes": ["single_family", "multi_family"],
    "featureKeywords": ["waterfront", "fireplace"],
    "bedsMin": 2,
    "listPriceMin": 250000,
    "listPriceMax": 750000,
    "resultsLimit": 1000,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyCountry": "US" }
}
```

### Output

Every home that matches your filters becomes one row, paginated automatically up to your `resultsLimit`. Fields Realtor.com does not publish for a given home come back null rather than guessed.

#### Example output

```json
{
    "listingAttribution": "Listing courtesy of Peachtree Realty Group",
    "propertyId": "M98765-43210",
    "mlsListingId": "7421809",
    "listingPath": "123-Magnolia-St_Atlanta_GA_30301_M98765-43210",
    "listingStatus": "for_sale",
    "askingPrice": 489000,
    "soldPrice": null,
    "priceCutAmount": 11000,
    "listedDate": "2024-05-18T00:00:00Z",
    "soldDate": null,
    "homeType": "single_family",
    "homeSubType": null,
    "bedroomCount": "4",
    "bathLabel": "3",
    "interiorSqft": 2480,
    "lotSqft": 8276,
    "yearBuilt": 2016,
    "garageSpaces": 2,
    "streetAddress": "123 Magnolia St",
    "cityName": "Atlanta",
    "stateName": "Georgia",
    "stateCode": "GA",
    "zipCode": "30301",
    "lat": 33.7490,
    "lng": -84.3880,
    "countyName": "Fulton",
    "countyFips": "13121",
    "streetViewLink": "https://maps.googleapis.com/maps/api/streetview?location=33.7490,-84.3880",
    "coverPhoto": "https://ap.rdcpix.com/abc123/cover-l.jpg",
    "photoCount": 38,
    "photoLinks": [
        "https://ap.rdcpix.com/abc123/photo1-l.jpg",
        "https://ap.rdcpix.com/abc123/photo2-l.jpg"
    ],
    "hasMatterport": true,
    "comingSoon": false,
    "freshListing": true,
    "priceDropped": true,
    "foreclosure": false,
    "newBuild": false,
    "pending": false,
    "contingent": false,
    "auction": false,
    "fractionalOwnership": false,
    "sourceId": "FMLS",
    "sourceName": "First Multiple Listing Service",
    "sourceType": "mls",
    "sourceListingId": "7421809",
    "showContactAgent": true,
    "marketType": "for_sale",
    "leadType": "co_broke",
    "veteransUnitedEligible": false,
    "productTags": ["core.agent", "core.broker"],
    "productBrand": "essentials",
    "primaryAgentType": "agent",
    "primaryAgentName": "Jane Carter",
    "primaryAgentEmail": "jane@peachtreerealty.com",
    "primaryAgentOffice": "Peachtree Realty Group",
    "primaryAgentPhones": ["+14045551234"],
    "secondaryAgentType": null,
    "secondaryAgentName": null,
    "secondaryAgentEmail": null,
    "secondaryAgentOffice": null,
    "secondaryAgentPhones": [],
    "brandingName": "Peachtree Realty Group",
    "searchPromotions": [],
    "communityPromotions": [],
    "openHouses": [
        { "start_date": "2024-05-25T17:00:00Z", "end_date": "2024-05-25T20:00:00Z" }
    ],
    "collectedAt": "2024-05-20T14:32:08.512000+00:00",
    "errorMessage": null
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `listingAttribution` | string | Required attribution text for the listing. |
| `propertyId` | string | Realtor.com internal property ID. |
| `mlsListingId` | string | MLS listing number. |
| `listingPath` | string | URL slug for the listing page. |
| `listingStatus` | string | Market state: for\_sale, sold, for\_rent, and so on. |
| `askingPrice` | integer | Current list price in USD. |
| `soldPrice` | integer | Closing price in USD, present only on sold homes. |
| `priceCutAmount` | integer | Price drop in USD. |
| `listedDate` | string | When the home went on the market. |
| `soldDate` | string | When the home closed. |
| `homeType` | string | Broad category such as single\_family or condo. |
| `homeSubType` | string | Finer category under the home type. |
| `bedroomCount` | string | Bedrooms, or a range when given. |
| `bathLabel` | string | Consolidated bathroom count. |
| `interiorSqft` | integer | Indoor living area in square feet. |
| `lotSqft` | integer | Lot size in square feet. |
| `yearBuilt` | integer | Year construction finished. |
| `garageSpaces` | integer | Garage parking spots. |
| `streetAddress` | string | Street line of the address. |
| `cityName` | string | City. |
| `stateName` | string | Full state name. |
| `stateCode` | string | Two-letter state code. |
| `zipCode` | string | ZIP or postal code. |
| `lat` | number | Latitude. |
| `lng` | number | Longitude. |
| `countyName` | string | County. |
| `countyFips` | string | County FIPS code. |
| `streetViewLink` | string | Google Street View URL. |
| `coverPhoto` | string | Lead listing photo URL. |
| `photoCount` | integer | Number of photos. |
| `photoLinks` | array | Listing photo URLs, up to ten. |
| `hasMatterport` | boolean | Listing has a Matterport 3D walkthrough. |
| `comingSoon` | boolean | Listing is tagged coming soon. |
| `freshListing` | boolean | Listing is under 14 days old. |
| `priceDropped` | boolean | Price fell within the last 30 days. |
| `foreclosure` | boolean | Home is in foreclosure. |
| `newBuild` | boolean | Home is newly constructed. |
| `pending` | boolean | Listing is pending. |
| `contingent` | boolean | Listing is contingent. |
| `auction` | boolean | Home is sold at auction. |
| `fractionalOwnership` | boolean | Home is fractionally owned. |
| `sourceId` | string | Listing source identifier. |
| `sourceName` | string | Source MLS or feed name. |
| `sourceType` | string | Type of the listing source. |
| `sourceListingId` | string | Listing ID from the source feed. |
| `showContactAgent` | boolean | Whether a contact-an-agent action is shown. |
| `marketType` | string | Lead market classification. |
| `leadType` | string | Lead routing type. |
| `veteransUnitedEligible` | boolean | Qualifies for Veterans United financing. |
| `productTags` | array | Promotional product tags on the listing. |
| `productBrand` | string | Brand behind the product placement. |
| `primaryAgentType` | string | Role of the first advertiser. |
| `primaryAgentName` | string | Name of the first advertiser. |
| `primaryAgentEmail` | string | Email of the first advertiser, when public. |
| `primaryAgentOffice` | string | Office of the first advertiser. |
| `primaryAgentPhones` | array | Phone numbers for the first advertiser. |
| `secondaryAgentType` | string | Role of the second advertiser. |
| `secondaryAgentName` | string | Name of the second advertiser. |
| `secondaryAgentEmail` | string | Email of the second advertiser, when public. |
| `secondaryAgentOffice` | string | Office of the second advertiser. |
| `secondaryAgentPhones` | array | Phone numbers for the second advertiser. |
| `brandingName` | string | Branding label on the listing. |
| `searchPromotions` | array | Promotions returned with the search result. |
| `communityPromotions` | array | Promotions tied to the home's community. |
| `openHouses` | array | Scheduled open house windows. |
| `collectedAt` | string | ISO 8601 timestamp for when the row was captured. |
| `errorMessage` | string | Reason a request failed; null on success. |

### Tips for best results

- Always pair `listingStatuses` with a location filter. A bare status with no `zipCode`, `cityName`, `stateCode`, or `addressLine` can pull far more homes than you want.
- Use `resultsLimit` to keep spend predictable. The run stops the moment it hits that number, so a small cap is a cheap way to test your filters first.
- `soldPriceMin` and `soldPriceMax` only bite when `listingStatuses` includes `sold`, so add `sold` to the status list when you want comps.
- If Realtor.com starts throttling, switch `proxyConfiguration` from datacenter to residential and raise `requestTimeoutSeconds`.
- Tighten `bedsMin`, `listPriceMin`, and `propertyTypes` before widening your area. Narrow filters keep the dataset focused and the cost down.

### How can I use Realtor.com listing data?

**How can I use the Realtor.com Search Scraper to pull comparable sales?**

Add `sold` to `listingStatuses`, set a `zipCode` or `cityName`, and give it a `soldDateFrom` so the comps stay recent. Each row carries `soldPrice`, `soldDate`, `bedroomCount`, `interiorSqft`, and `streetAddress`, which is everything you need to price a listing or back up an offer.

**How can I build a real estate lead list from Realtor.com search results?**

Keep `listingStatuses` on `for_sale` for your target city and export the run. The output includes `primaryAgentName`, `primaryAgentEmail`, `primaryAgentOffice`, and `primaryAgentPhones` for each home, so you get an agent contact sheet alongside the property data.

**How can I find investment property data on Realtor.com?**

Turn on `foreclosureOnly` or `newConstructionOnly`, or filter by `priceDropped` after export, to surface distressed and motivated listings across a `stateCode`. Combine `askingPrice`, `lotSqft`, `yearBuilt`, and `priceCutAmount` to score deals against your criteria.

**How can I scrape Realtor.com rentals that allow pets?**

Set `listingStatuses` to `for_rent` and switch on `catsAllowed` or `dogsAllowed`. The scraper returns rental homes with `askingPrice`, `bedroomCount`, and full address fields, ready to drop into a search sheet for tenants or property managers.

### 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

## `listingStatuses` (type: `array`):

Pick which market states to pull. Choose one or more of: for\_sale (live on the market), sold (closed deals, great for comps), for\_rent (active rentals), ready\_to\_build (new-build plans), off\_market, other, new\_community. For example \['for\_sale', 'ready\_to\_build'] grabs both live homes and upcoming projects.

## `zipCode` (type: `string`):

Narrow the search to one 5-digit US ZIP. This is the most precise way to lock onto a single neighborhood. For example '78704' for South Austin.

## `stateCode` (type: `string`):

Limit results to a single 2-letter US state. Pair it with other filters so you don't sweep up every home in the state. For example 'TX' for Texas or 'FL' for Florida.

## `cityName` (type: `string`):

Match on an exact city name. Combine with stateCode when a city name repeats across states (think Springfield). For example 'Denver' or 'Miami'.

## `streetName` (type: `string`):

Zero in on homes along one street. Handy for block-level market checks. For example 'Ocean Dr' or 'Elm St'.

## `addressLine` (type: `string`):

Look up one exact address line to pull its listing history or current details. For example '742 Evergreen Terrace'.

## `propertyTypes` (type: `array`):

Keep only the home categories you care about. Accepted values: apartment, condo\_townhome, condo\_townhome\_rowhome\_coop, condo, condos, single\_family, multi\_family, mobile, land, farm, other. For example \['single\_family', 'condo'] returns only houses and condos.

## `featureKeywords` (type: `array`):

Require specific amenities or features on each home. Options include: basement, carport, central\_air, den, hardwood\_floors, pool, waterfront, ocean\_view, fireplace. For example \['pool', 'waterfront'] surfaces only homes with both.

## `bedsMin` (type: `integer`):

Lowest bedroom count to accept. For example 2 keeps only homes with 2 or more bedrooms.

## `bedsMax` (type: `integer`):

Highest bedroom count to accept. For example 4 drops anything larger.

## `bathsMin` (type: `integer`):

Lowest bathroom count to accept, half-baths included. For example 2 keeps homes with at least two bathrooms.

## `bathsMax` (type: `integer`):

Highest bathroom count to accept.

## `listPriceMin` (type: `integer`):

Lowest active asking price in USD. For example 250000 hides anything under $250k.

## `listPriceMax` (type: `integer`):

Highest active asking price in USD. For example 750000 caps the search at $750k.

## `soldPriceMin` (type: `integer`):

Lowest closing price in USD. This only applies when listingStatuses includes 'sold'. For example 400000.

## `soldPriceMax` (type: `integer`):

Highest closing price in USD. This only applies when listingStatuses includes 'sold'. For example 800000.

## `soldDateFrom` (type: `string`):

Earliest sale date in YYYY-MM-DD form. Use it to keep comps recent. For example '2024-01-01' returns sales from 2024 onward.

## `soldDateTo` (type: `string`):

Latest sale date in YYYY-MM-DD form. For example '2024-12-31'.

## `sqftMin` (type: `integer`):

Smallest interior living area in square feet. For example 1200.

## `sqftMax` (type: `integer`):

Largest interior living area in square feet. For example 3500.

## `lotSqftMin` (type: `integer`):

Smallest lot size in square feet. For example 4000.

## `lotSqftMax` (type: `integer`):

Largest lot size in square feet. For example 12000.

## `yearBuiltFrom` (type: `integer`):

Earliest construction year to keep. Set a floor to skip older stock. For example 2015 for newer builds.

## `yearBuiltTo` (type: `integer`):

Latest construction year to keep. Set a ceiling to chase older or historic homes. For example 1990.

## `hoaFeeMax` (type: `integer`):

Highest monthly Homeowners Association fee you'll accept. For example 250 finds homes with light or no HOA dues. Ignored when 'No HOA fee' is on.

## `noHoaFee` (type: `boolean`):

Turn on to return only homes with no Homeowners Association fee at all.

## `openHouseFrom` (type: `string`):

Keep homes with an open house from this date forward (YYYY-MM-DD). For example '2024-06-01'.

## `openHouseTo` (type: `string`):

Keep homes with an open house up to this date (YYYY-MM-DD). For example '2024-06-30'.

## `pendingOnly` (type: `boolean`):

Turn on to return only homes flagged as Pending (under contract).

## `contingentOnly` (type: `boolean`):

Turn on to return only homes flagged as Contingent (under contract with conditions).

## `foreclosureOnly` (type: `boolean`):

Turn on to isolate homes that are actively in foreclosure. Useful for sourcing distressed deals.

## `newConstructionOnly` (type: `boolean`):

Turn on to isolate homes tagged as newly built. Handy for tracking builder activity.

## `hasVirtualTour` (type: `boolean`):

Turn on to keep only listings that ship with at least one kind of virtual tour.

## `hasMatterport` (type: `boolean`):

Turn on to keep only listings that carry a Matterport 3D walkthrough.

## `catsAllowed` (type: `boolean`):

Turn on to keep only rentals that explicitly allow cats.

## `dogsAllowed` (type: `boolean`):

Turn on to keep only rentals that explicitly allow dogs.

## `sortField` (type: `string`):

Choose the field Realtor.com uses to order the response.

## `sortDirection` (type: `string`):

Pick the run order: descending puts newest or highest first, ascending puts oldest or lowest first.

## `agentSourceId` (type: `string`):

Keep only listings tied to one specific agent source ID.

## `sellingAgentName` (type: `string`):

Match listings by the selling agent's first and last name. For example 'Jane Smith'.

## `mlsListingId` (type: `string`):

Pull one listing by its MLS or source-system ID. For example '87654321'.

## `propertyId` (type: `string`):

Pull one home directly by its Realtor.com internal property ID. For example 'M98765-43210'.

## `fulfillmentId` (type: `string`):

Keep only listings tied to a specific agent fulfillment ID.

## `pageSize` (type: `integer`):

How many listings to request in one API call. Realtor.com allows up to 200. Leave it at 200 to move fastest.

## `startOffset` (type: `integer`):

Where in the result set the scraper begins. Bump it to skip the first records or resume a run that stopped early. Leave at 0 to start from the top.

## `resultsLimit` (type: `integer`):

Hard ceiling on how many listings the run collects across all pages. The scraper stops the instant it hits this number, which keeps spend predictable. Max is 5000. For example 300 stops at exactly 300 homes.

## `timeoutSeconds` (type: `integer`):

If the run outlasts this many seconds, it shuts down cleanly. Raise it for very large searches. For example 300 is five minutes.

## `requestTimeoutSeconds` (type: `integer`):

How long to wait on each Realtor.com GraphQL call before giving up on it. For example 45 waits 45 seconds.

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

Route requests through proxies to mask your IP and avoid blocks. US datacenter proxies are the default and work for most searches.

## Actor input object example

```json
{
  "listingStatuses": [
    "sold",
    "for_sale"
  ],
  "zipCode": "78704",
  "stateCode": "TX",
  "cityName": "Denver",
  "propertyTypes": [
    "single_family",
    "multi_family"
  ],
  "featureKeywords": [
    "waterfront",
    "fireplace"
  ],
  "bedsMin": 2,
  "bedsMax": 4,
  "bathsMin": 2,
  "listPriceMin": 250000,
  "listPriceMax": 750000,
  "soldDateFrom": "2024-01-01",
  "soldDateTo": "2024-12-31",
  "yearBuiltFrom": 2015,
  "yearBuiltTo": 2024,
  "noHoaFee": false,
  "pendingOnly": false,
  "contingentOnly": false,
  "foreclosureOnly": false,
  "newConstructionOnly": false,
  "hasVirtualTour": false,
  "hasMatterport": false,
  "catsAllowed": false,
  "dogsAllowed": false,
  "sortField": "list_date",
  "sortDirection": "desc",
  "pageSize": 200,
  "startOffset": 0,
  "resultsLimit": 1000,
  "timeoutSeconds": 300,
  "requestTimeoutSeconds": 45,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "listingStatuses": [
        "for_sale"
    ],
    "zipCode": "10022",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/realtor-search-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 = {
    "listingStatuses": ["for_sale"],
    "zipCode": "10022",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("data_api/realtor-search-scraper-cheap").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 '{
  "listingStatuses": [
    "for_sale"
  ],
  "zipCode": "10022",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}' |
apify call data_api/realtor-search-scraper-cheap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data_api/realtor-search-scraper-cheap"
        }
    }
}

```

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/QNI3UvEVgfLvCgWuy/builds/M2ttHcJxnBeJjkPyl/openapi.json
