# Price Reduced Property Scraper (Cheap) (`data_api/price-reduced-property-scraper-cheap`) Actor

Price reduced properties list tool that extracts motivated sellers and recent price drops, giving wholesale real estate investors access to discount margins instantly.

- **URL**: https://apify.com/data\_api/price-reduced-property-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 $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.

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

## Price Reduced Property Scraper

![Price Reduced Property Scraper](cover.jpg)

A price cut is usually the clearest sign a seller is ready to deal. The catch is finding the fresh ones, which normally means refreshing a portal all day or paying for a subscription you barely use. This scraper does the watching for you. Hand it a ZIP code or a state and it returns every home that just dropped its price as clean rows: the new asking price, the exact dollar amount cut, the full address, beds and baths, square footage, agent contacts, coordinates, and photos. One run gets you a price-drop dataset you can load into a spreadsheet, a CRM, or a model.

### What you get

Every home comes back as one flat row, so columns line up when you load the results into a sheet or database. The fields sort into a few groups:

- **Price and timing** — `currentPrice`, `priceDropAmount`, `closedPrice`, `dateListed`, `dateClosed`, plus the `flagPriceDrop` marker
- **Identity and status** — `homeId`, `listingRef`, `listingPath`, `saleStatus`, and lifecycle flags like `flagPending`, `flagContingent`, `flagAuction`, `flagFreshListing`
- **Home details** — `homeType`, `homeSubType`, `bedrooms`, `bathrooms`, `livingArea`, `lotArea`, `constructionYear`, `garageCount`, `hasVirtualTour`
- **Location** — `addressLine`, `cityName`, `stateName`, `stateCode`, `zipCode`, `geoLat`, `geoLng`, `countyName`, `countyFips`, `streetViewLink`
- **Media** — `heroPhoto`, `imageTotal`, `imageGallery`
- **Agents and source** — `leadAgentName`, `leadAgentEmail`, `leadAgentPhones`, `coAgentName`, `brokerBranding`, `feedName`, `openHouseSlots`

### Quick start

1. Press **Try for free** to open the input form.
2. Type a location into at least one of **ZIP code**, **City**, or **State abbreviation**.
3. Add any filters you like, such as an asking-price range, bedroom count, or home type.
4. Set a **Total listings cap** to keep spend predictable, choose a proxy, then press **Start**.
5. Once the run finishes, export the data as JSON, CSV, Excel, or XML.

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

### Use cases

- **Buyer hunting** — pull every recent price drop in your target ZIP and reach out before the listing climbs back up
- **Investor sourcing** — sort by `priceDropAmount` to find sellers cutting hard and chasing a quick close
- **Lead generation** — collect listing agent names, emails, and phone numbers for homes that just got cheaper
- **Market tracking** — schedule a daily run and watch how reductions move across a neighborhood over time
- **Deal screening** — filter by price, beds, square footage, and build year to shortlist drops that fit your budget

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `zipCode` | string | One of zipCode, cityName, stateCode, or addressLine | Single 5-digit US ZIP code, the tightest location filter. Prefilled `78704`. |
| `stateCode` | string | One of zipCode, cityName, stateCode, or addressLine | Two-letter US state code, best paired with another filter. Example `TX`. |
| `cityName` | string | One of zipCode, cityName, stateCode, or addressLine | Exact city name; pair with `stateCode` for clean results. Example `Austin`. |
| `streetName` | string | Optional | Limit results to homes on one named street, e.g. `Congress Ave`. |
| `addressLine` | string | Optional | One precise street address line. |
| `homeCategories` | array of strings | No | Keep only chosen home categories, e.g. `single_family`, `condo`. |
| `featureTags` | array of strings | No | Filter by features such as `pool`, `hardwood_floors`, `central_air`. |
| `bedroomsFrom` / `bedroomsTo` | integer | No | Fewest and most bedrooms to allow. |
| `bathroomsFrom` / `bathroomsTo` | integer | No | Fewest and most bathrooms to allow. |
| `priceFrom` / `priceTo` | integer | No | Current asking-price range in USD. |
| `closedPriceFrom` / `closedPriceTo` | integer | No | Closed-price range in USD. |
| `closedDateFrom` / `closedDateTo` | string | No | Closed-sale date window, written `YYYY-MM-DD`. |
| `livingAreaFrom` / `livingAreaTo` | integer | No | Interior living area range in square feet. |
| `lotAreaFrom` / `lotAreaTo` | integer | No | Lot size range in square feet. |
| `builtYearFrom` / `builtYearTo` | integer | No | Construction year range. |
| `hoaFeeCap` | integer | No | Highest monthly HOA fee to allow. |
| `noHoaOnly` | boolean | No | Return only homes with no HOA fee. Default `false`. |
| `openHouseFrom` / `openHouseTo` | string | No | Open-house date window, written `YYYY-MM-DD`. |
| `batchSize` | integer | No | Listings fetched per request. Default `150`. |
| `startIndex` | integer | No | Position where pagination begins. Default `0`. |
| `maxRecords` | integer | No | Hard cap on total listings collected. Default `3000`. |
| `runBudgetSeconds` | integer | No | Whole-run time budget in seconds. Default `360`. |
| `requestBudgetSeconds` | integer | No | Per-request time budget in seconds. Default `45`. |
| `proxyConfiguration` | object | No | Proxies used for requests. Defaults to US datacenter. |

#### Example input

```json
{
    "stateCode": "TX",
    "cityName": "Austin",
    "homeCategories": ["single_family", "condo"],
    "priceTo": 800000,
    "bedroomsFrom": 2,
    "maxRecords": 200,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyCountry": "US"
    }
}
```

### Output

Each price-reduced home becomes one flat JSON row. Every declared field shows up on a normal row, and any value the source does not provide comes back as `null` or empty so your dataset stays rectangular.

#### Example output

```json
{
    "feedAttribution": true,
    "homeId": "9482736150",
    "listingRef": "2967451308",
    "listingPath": "1809-Kinney-Ave_Austin_TX_78704_M94827-36150",
    "saleStatus": "for_sale",
    "currentPrice": 524000,
    "closedPrice": null,
    "priceDropAmount": 26000,
    "dateListed": "2026-05-22",
    "dateClosed": "",
    "homeType": "single_family",
    "homeSubType": "",
    "bedrooms": 3,
    "bathrooms": "2",
    "livingArea": 1720,
    "lotArea": 6100,
    "constructionYear": 2004,
    "garageCount": 2,
    "addressLine": "1809 Kinney Ave",
    "cityName": "Austin",
    "stateName": "Texas",
    "stateCode": "TX",
    "zipCode": "78704",
    "geoLat": 30.2453,
    "geoLng": -97.7691,
    "countyName": "Travis County",
    "countyFips": "48453",
    "streetViewLink": "https://maps.googleapis.com/maps/api/streetview?location=30.2453,-97.7691",
    "heroPhoto": "https://ap.rdcpix.com/example/hero-2x.jpg",
    "imageTotal": 28,
    "imageGallery": [
        "https://ap.rdcpix.com/example/photo-1.jpg",
        "https://ap.rdcpix.com/example/photo-2.jpg"
    ],
    "hasVirtualTour": true,
    "flagComingSoon": false,
    "flagFreshListing": false,
    "flagPriceDrop": true,
    "flagNewBuild": false,
    "flagPending": false,
    "flagContingent": false,
    "flagAuction": false,
    "flagFractional": false,
    "feedId": "ACTRIS",
    "feedName": "Austin Board of Realtors",
    "feedType": "mls",
    "feedListingRef": "T7891234",
    "offersAgentContact": true,
    "leadMarket": "for_sale",
    "leadCategory": "advantage",
    "flagVaEligible": false,
    "productSet": ["co_broke"],
    "productBrand": "essentials",
    "leadAgentRole": "seller",
    "leadAgentName": "Daniel Reyes",
    "leadAgentEmail": "daniel.reyes@example.com",
    "leadAgentBrokerage": "Hill Country Realty",
    "leadAgentPhones": ["5125550174"],
    "coAgentRole": null,
    "coAgentName": null,
    "coAgentEmail": null,
    "coAgentBrokerage": null,
    "coAgentPhones": [],
    "brokerBranding": "Hill Country Realty",
    "searchPromos": [],
    "communityPromos": [],
    "openHouseSlots": [
        {
            "start_date": "2026-06-14T17:00:00Z",
            "end_date": "2026-06-14T20:00:00Z",
            "description": "Saturday open house",
            "time_zone": "America/Chicago"
        }
    ],
    "capturedAt": "2026-06-29T12:00:00.000000+00:00",
    "failureReason": null
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `feedAttribution` | boolean | Attribution flag passed through from the listing feed |
| `homeId` | string | Stable internal identifier for the home |
| `listingRef` | string | Identifier of the specific listing |
| `listingPath` | string | URL slug for the listing |
| `saleStatus` | string | Current state, such as `for_sale` or `sold` |
| `currentPrice` | integer | Latest asking price in USD after any reduction |
| `closedPrice` | integer | Final closing price in USD, on sold homes only |
| `priceDropAmount` | integer | Dollar amount the asking price has been cut, in USD |
| `dateListed` | string | ISO 8601 date the listing went live |
| `dateClosed` | string | ISO 8601 date the sale closed, when applicable |
| `homeType` | string | Top-level home type, e.g. `single_family` |
| `homeSubType` | string | Finer home classification |
| `bedrooms` | integer | Number of bedrooms |
| `bathrooms` | string | Consolidated bathroom count |
| `livingArea` | integer | Interior living area in square feet |
| `lotArea` | integer | Outdoor lot size in square feet |
| `constructionYear` | integer | Year the home was built |
| `garageCount` | integer | Number of garage spaces |
| `addressLine` | string | Full street address line |
| `cityName` | string | City the home sits in |
| `stateName` | string | Full state name |
| `stateCode` | string | Two-letter US state code |
| `zipCode` | string | ZIP or postal code |
| `geoLat` | number | Latitude of the home |
| `geoLng` | number | Longitude of the home |
| `countyName` | string | County the home falls under |
| `countyFips` | string | County FIPS code |
| `streetViewLink` | string | Link to a street-level map preview |
| `heroPhoto` | string | Direct link to the headline photo |
| `imageTotal` | integer | How many photos accompany the listing |
| `imageGallery` | array | Direct image URLs for the home |
| `hasVirtualTour` | boolean | True when a Matterport 3D tour is attached |
| `flagComingSoon` | boolean | True when marked coming soon |
| `flagFreshListing` | boolean | True when flagged as a new listing |
| `flagPriceDrop` | boolean | True when the price recently dropped |
| `flagNewBuild` | boolean | True when newly built |
| `flagPending` | boolean | True when the sale is pending |
| `flagContingent` | boolean | True when the sale is contingent |
| `flagAuction` | boolean | True when sold at auction |
| `flagFractional` | boolean | True when ownership is fractional |
| `feedId` | string | Identifier of the originating feed |
| `feedName` | string | Name of the originating feed, e.g. the local MLS |
| `feedType` | string | Type of the originating feed |
| `feedListingRef` | string | Listing ID in the source feed |
| `offersAgentContact` | boolean | Whether a contact-an-agent action is offered |
| `leadMarket` | string | Lead market classification |
| `leadCategory` | string | Lead type for the listing |
| `flagVaEligible` | boolean | True when flagged Veterans United eligible |
| `productSet` | array | Distribution products attached to the listing |
| `productBrand` | string | Brand name tied to the products |
| `leadAgentRole` | string | Role of the primary representative |
| `leadAgentName` | string | Name of the primary representative |
| `leadAgentEmail` | string | Email for the primary representative |
| `leadAgentBrokerage` | string | Office handling the primary representative |
| `leadAgentPhones` | array | Phone numbers for the primary representative |
| `coAgentRole` | string | Role of the secondary representative |
| `coAgentName` | string | Name of the secondary representative |
| `coAgentEmail` | string | Email for the secondary representative |
| `coAgentBrokerage` | string | Office handling the secondary representative |
| `coAgentPhones` | array | Phone numbers for the secondary representative |
| `brokerBranding` | string | Affiliated agent branding label |
| `searchPromos` | array | Search-level promotions attached to the listing |
| `communityPromos` | array | Community-level promotions attached to the listing |
| `openHouseSlots` | array | Scheduled open house entries with times and notes |
| `capturedAt` | string | ISO 8601 timestamp of when the row was captured |
| `failureReason` | string | Reason a row failed; `null` on success |

### Tips for best results

- **Always set a location.** Give the scraper at least one of `zipCode`, `cityName`, `stateCode`, or `addressLine`, or it has nothing to search against.
- **Start small.** Drop `maxRecords` to around 50 on your first run so you can confirm the fields match your pipeline before pulling thousands.
- **Pair `cityName` with `stateCode`.** A city name on its own can match across several states; the two together keep results tight.
- **Sort by `priceDropAmount`.** The biggest cuts usually point to the most motivated sellers, so that column is a fast way to rank the list.
- **Switch proxy tiers if requests start failing.** US datacenter clears most runs; move to residential if you hit repeated errors.
- **Raise `requestBudgetSeconds`** toward 60 to 90 on slower proxies, and give `runBudgetSeconds` more room for large states.

### How can I use price-drop property data?

**How can I use the Price Reduced Property Scraper to find motivated sellers?**
Enter a target ZIP code or city and the scraper returns every home with a recent price cut, each carrying the new `currentPrice`, the `priceDropAmount`, the street address, beds and baths, and the listing agent's name, email, and phone. Sort by `priceDropAmount` to put the deepest reductions at the top, then export the rows straight into your CRM.

**How can I track price reductions across a neighborhood over time?**
Save your filters and schedule the run on Apify to repeat daily. Every row stamps `capturedAt` and carries `flagPriceDrop` along with `dateListed`, so you can diff one day's dataset against the last and watch how asking prices move block by block.

**How can I scrape discounted home listings across a whole state?**
Pass a `stateCode` such as `TX`, raise `maxRecords`, and the scraper paginates through the available inventory and hands back one row per home. Filter by `homeCategories`, an asking-price range, or bedroom count to keep only the reduced listings that match your buy box.

**How can I pull listing agent contacts for homes that just dropped in price?**
Each row includes `leadAgentName`, `leadAgentEmail`, `leadAgentPhones`, and `leadAgentBrokerage`, plus the same set for a co-agent when one is present. Combine those with the price and location fields to build an outreach list aimed only at sellers who have already shown they will negotiate.

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

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

Zero in on one 5-digit US ZIP code. This is the sharpest way to lock onto a single neighborhood. As an example, use '78704' for South Austin, TX.

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

Open the search up to a whole state with its 2-letter code. It pairs nicely with a tighter filter. Think 'TX' for Texas or 'AZ' for Arizona.

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

Pin the search to one city by its exact name. Combine it with stateCode for the cleanest match. Try 'Austin' or 'Phoenix'.

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

Keep results to homes on a single named street, like 'Congress Ave' or 'Maple St'.

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

Look up one exact street address, for example '1600 Barton Springs Rd'.

## `homeCategories` (type: `array`):

Hold onto only the home categories you want. Allowed values: apartment, condo\_townhome, condo\_townhome\_rowhome\_coop, condo, condos, single\_family, multi\_family, mobile, land, farm, other.

## `featureTags` (type: `array`):

Filter listings by the perks or features that matter. Sample values: basement, carport, central\_air, den, hardwood\_floors, pool, waterfront, ocean\_view, fireplace.

## `bedroomsFrom` (type: `integer`):

Fewest bedrooms a listing may have.

## `bedroomsTo` (type: `integer`):

Most bedrooms a listing may have.

## `bathroomsFrom` (type: `integer`):

Fewest bathrooms a listing may have, half-baths counted.

## `bathroomsTo` (type: `integer`):

Most bathrooms a listing may have.

## `priceFrom` (type: `integer`):

Lowest current asking price to include, in USD.

## `priceTo` (type: `integer`):

Highest current asking price to include, in USD.

## `closedPriceFrom` (type: `integer`):

Lowest final closed price to include, in USD.

## `closedPriceTo` (type: `integer`):

Highest final closed price to include, in USD.

## `closedDateFrom` (type: `string`):

Keep only homes that closed on or after this date, written as YYYY-MM-DD.

## `closedDateTo` (type: `string`):

Keep only homes that closed on or before this date, written as YYYY-MM-DD.

## `livingAreaFrom` (type: `integer`):

Smallest interior living area to allow, in square feet.

## `livingAreaTo` (type: `integer`):

Largest interior living area to allow, in square feet.

## `lotAreaFrom` (type: `integer`):

Smallest lot size to allow, in square feet.

## `lotAreaTo` (type: `integer`):

Largest lot size to allow, in square feet.

## `builtYearFrom` (type: `integer`):

Earliest construction year to allow.

## `builtYearTo` (type: `integer`):

Latest construction year to allow; drop it lower to surface older homes.

## `hoaFeeCap` (type: `integer`):

Highest monthly Homeowners Association fee you will accept.

## `noHoaOnly` (type: `boolean`):

Switch this on to return only homes that carry no Homeowners Association fee.

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

Show only homes with an open house booked on or after this date (YYYY-MM-DD).

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

Show only homes with an open house booked on or before this date (YYYY-MM-DD).

## `batchSize` (type: `integer`):

How many listings to pull on each call to the source. Default 150.

## `startIndex` (type: `integer`):

The positional index where pagination kicks off. Default 0.

## `maxRecords` (type: `integer`):

The firm ceiling on how many listings a run gathers across every page. Default 3000.

## `runBudgetSeconds` (type: `integer`):

Once a run passes this many seconds, it finishes up gracefully and exits. Default 360.

## `requestBudgetSeconds` (type: `integer`):

How long to wait on each individual request before moving on. Default 45.

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

Choose the proxies that carry your requests so you stay quiet and dodge blocks. US datacenter proxies are the default.

## Actor input object example

```json
{
  "zipCode": "78704",
  "stateCode": "TX",
  "cityName": "Austin",
  "homeCategories": [
    "single_family",
    "condo"
  ],
  "featureTags": [
    "pool",
    "hardwood_floors"
  ],
  "bedroomsFrom": 2,
  "bedroomsTo": 4,
  "bathroomsFrom": 1,
  "priceFrom": 175000,
  "priceTo": 800000,
  "closedDateFrom": "2024-01-01",
  "closedDateTo": "2024-12-31",
  "builtYearFrom": 1995,
  "builtYearTo": 2022,
  "noHoaOnly": false,
  "batchSize": 150,
  "startIndex": 0,
  "maxRecords": 500,
  "runBudgetSeconds": 360,
  "requestBudgetSeconds": 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 = {
    "zipCode": "78704",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/price-reduced-property-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 = {
    "zipCode": "78704",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("data_api/price-reduced-property-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 '{
  "zipCode": "78704",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}' |
apify call data_api/price-reduced-property-scraper-cheap --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1dWiMfnV3Fxttg9zE/builds/EZiO0jEAbMERQ49Au/openapi.json
