# HAR.com Real Estate Scraper — Houston & Texas Listings (`muhammadafzal/har-texas-real-estate-scraper`) Actor

Extract Houston MLS listings from HAR.com with this real estate scraper: price, address, beds, baths, sq ft, MLS number, agent and brokerage for investors.

- **URL**: https://apify.com/muhammadafzal/har-texas-real-estate-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Real estate, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 texas property listings

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## HAR.com Real Estate Scraper — Houston & Texas Listings

This HAR.com real estate scraper turns HAR.com search results into clean JSON, CSV or Excel records of Houston and Texas homes for sale: price, full address, beds, baths, square feet, MLS number, listing agent and brokerage. It is built for real estate investors, agents, market analysts and proptech teams who need HAR real estate data in a spreadsheet, database or AI agent without copying listings by hand.

> **Price:** $4.00 per 1,000 listings on the FREE tier ($3.20 on GOLD and above), plus a $0.005 start fee per run.

Give the Actor a Texas city, a five-digit ZIP code, or the URL of any HAR.com search-results page. It reads the listing data that HAR.com embeds in its own search pages (up to 120 listings per page), so most runs finish in a few seconds without a browser.

### What data you get from HAR.com

One record per listing, deduplicated by HAR.com listing ID. Values HAR.com does not show are `null`, never guessed.

| Data | Fields |
|---|---|
| Price | `price`, `priceText`, `originalPrice`, `pricePerSqft` |
| Location | `address`, `streetAddress`, `city`, `state`, `zipCode`, `subdivision`, `marketArea`, `latitude`, `longitude` |
| Home facts | `propertyType`, `propertyClassId`, `bedrooms`, `bathrooms`, `fullBathrooms`, `halfBathrooms`, `squareFeet`, `lotSize`, `lotSizeSqft`, `acres`, `yearBuilt`, `stories`, `garageSpaces`, `hasPrivatePool` |
| Listing status | `status` (for example Active), `daysOnMarket`, `isForeclosure`, `hasOpenHouse`, `lastModifiedAt` |
| Costs | `hoaFee` (maintenance fee), `taxAmount` (annual property tax) |
| MLS and links | `mlsNumber`, `listingId`, `harId`, `listingUrl`, `sourceSearchUrl` |
| Listing agent | `agentName`, `agentProfileUrl`, `brokerage`, `brokerageUrl`, `brokeragePhone` |
| Photos and remarks | `photoCount`, `imageUrls`, `description` (with listing-page details on) |
| Run info | `detailsEnriched`, `scrapedAt`, `warnings` |

The dataset has two ready-made table views: **Listings** (address, price, beds, baths, square feet, type, status, MLS number, link) and **Agents and brokerages**.

### When to use it, and when not to

Use it to:

- track Houston MLS listings shown on HAR.com for a city, ZIP code or neighborhood;
- build comps, price-per-square-foot and days-on-market reports for Texas real estate listings;
- watch new single-family homes, townhouses or land in a price band and feed them to a sheet, CRM or alert;
- give an AI agent a predictable, typed real estate web scraper for HAR.com.

Do not use it for:

- sold history, rentals or off-market data (it is built and tested for for-sale searches);
- a licensed MLS data feed: it reads what HAR.com shows publicly, not the agents' MLS system;
- single listing pages as input (it needs search-results pages; see the input table).

### How to scrape HAR.com listings: input

| Field | What it does | Example |
|---|---|---|
| `city` | City-wide for-sale search. Used when `startUrls` is empty. | `Houston`, `Katy`, `Boerne` |
| `zipCode` | Five-digit ZIP search. With a city it narrows the city search; with `startUrls` it keeps only listings in that ZIP. | `77002` |
| `startUrls` | Up to 20 HAR.com search-results pages (city, ZIP or neighborhood `for_sale` pages). Takes precedence over `city`. | `https://www.har.com/houston/realestate/for_sale` |
| `minPrice` / `maxPrice` | Price range in USD. | `250000` / `400000` |
| `minBedrooms` | Minimum bedrooms (0–20). | `3` |
| `propertyType` | `Any`, `Single-Family`, `Townhouse/Condo`, `Mid/Hi-Rise Condo`, `Multi-Family`, `Land`, `Country Homes/Acreage`. | `Single-Family` |
| `maxResults` | Listings to return, 1–500 (default 20). | `50` |
| `enrichDetails` | Also open listing pages for the public description and listing-page photos (default off, best effort). | `true` |
| `maxDetailPages` | Listing pages to open when `enrichDetails` is on, 0–50 (default 10). | `10` |

With no city, ZIP or URL the Actor searches Houston.

Single-family homes in Houston between $250,000 and $400,000 with at least 3 bedrooms:

```json
{
  "city": "Houston",
  "minPrice": 250000,
  "maxPrice": 400000,
  "minBedrooms": 3,
  "propertyType": "Single-Family",
  "maxResults": 50
}
```

A ZIP code search page with listing descriptions for the first five results:

```json
{
  "startUrls": [{ "url": "https://www.har.com/zipcode_77002/realestate/for_sale" }],
  "maxResults": 10,
  "enrichDetails": true,
  "maxDetailPages": 5
}
```

### Use it as a HAR.com real estate listings API

Run the Actor from the Apify API, the Apify CLI, a scheduled Apify task, an Apify integration or the Apify MCP server. This call waits for the run and returns the listings as JSON:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/muhammadafzal~har-texas-real-estate-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"city": "Katy", "propertyType": "Single-Family", "maxResults": 25}'
```

Add `&format=csv` or `&format=xlsx` to the URL for a spreadsheet. The input and dataset schemas describe every field, and `maxResults` gives an agent a fixed budget.

### Output example

```json
{
  "listingId": "11359849",
  "harId": "3743500",
  "mlsNumber": "41598174",
  "listingUrl": "https://www.har.com/homedetail/6615-green-pear-ln-houston-tx-77049/3743500",
  "address": "6615 E Green Pear Ln, Houston, TX 77049",
  "city": "Houston",
  "state": "TX",
  "zipCode": "77049",
  "marketArea": "North Channel",
  "subdivision": "Liberty Lakes Sec 4",
  "latitude": 29.823682,
  "longitude": -95.163853,
  "price": 263500,
  "priceText": "$263,500",
  "pricePerSqft": 102,
  "status": "Active",
  "propertyType": "Single-Family",
  "bedrooms": 3,
  "bathrooms": 2.5,
  "squareFeet": 2577,
  "lotSize": "4,450 sq ft",
  "yearBuilt": 2006,
  "garageSpaces": 2,
  "hoaFee": 37.5,
  "taxAmount": 6194,
  "daysOnMarket": 1,
  "photoCount": 30,
  "imageUrls": ["https://mediahar.harstatic.com/819223736/lr/819226830.jpeg"],
  "description": null,
  "agentName": "Nidia Regalado",
  "brokerage": "Sucre' Realty",
  "brokeragePhone": "713-799-3546",
  "detailsEnriched": false,
  "scrapedAt": "2026-10-25T12:00:00.000Z",
  "warnings": []
}
```

(Shortened; every field in the table above is present in each record.)

Each run also writes one `OUTPUT` record with the status and counts:

- `DATA`: listings delivered.
- `EMPTY`: the search worked but nothing matched your filters. Only the start fee is charged.
- `REJECTED`: the input cannot work, for example `minPrice` above `maxPrice`, a non-HAR.com URL, a single-listing URL, or a page with no listing results. The message says what to change.
- `BLOCKED`: HAR.com refused every access attempt before any listing was delivered. The run fails with no listing charges.
- `FAILED`: an unexpected error. No listing charges.

### Pricing

Pay per event. Platform usage is included in these prices; you are not billed separately for compute or traffic.

| Event | FREE | BRONZE (−2.5%) | SILVER (−5%) | GOLD, PLATINUM, DIAMOND (−20%) |
|---|---|---|---|---|
| Texas property listing (one dataset record) | $0.004 | $0.0039 | $0.0038 | $0.0032 |
| Actor start | $0.005 | $0.005 | $0.005 | $0.005 |

The start fee is charged once per started GB of allocated memory. The Actor runs at 256 MB by default, so a normal run pays one start event.

Example totals:

| Run | FREE | GOLD |
|---|---|---|
| 3 listings (the prefilled example) | $0.017 | $0.0146 |
| 20 listings | $0.085 | $0.069 |
| 120 listings (one full search page) | $0.485 | $0.389 |
| 500 listings (the maximum) | $2.005 | $1.605 |

Listing-page details (`enrichDetails`) cost nothing extra per event. Set Apify's "Maximum cost per run" to cap spending; the Actor stops cleanly at the limit and charges only for listings it delivered.

### Reliability, limits and failure modes

- **Access.** HAR.com uses anti-bot protection. The Actor first tries a direct request; from Apify's cloud those are usually challenged, so runs continue over a US residential network route. On that route about half of search-page attempts get through on the first try. Every retry uses a new IP with a short backoff, and the Actor gives up only after 8 challenges in a row. It never solves CAPTCHAs, logs in or uses account cookies. If HAR.com keeps refusing, the run ends `BLOCKED` instead of returning made-up rows.
- **Speed.** Measured on the current build: 3 listings in about 3 seconds, 150 Katy listings in about 8 seconds, 500 Houston listings in about 40 seconds.
- **Coverage.** Results come from HAR.com search pages: up to 120 listings per page and at most 10 pages per search URL. HAR.com caps one search at 10,000 matches. HAR.com covers the Houston region best; other Texas cities (Boerne was tested) return whatever HAR.com lists. An unknown city ends `EMPTY`, not with invented data.
- **Listing-page details** are best effort. HAR.com challenges more listing-page requests than search pages, so each page is tried up to 5 times. In a 50-page test, 47 pages were enriched; listings that could not be read keep all their search fields, with `detailsEnriched: false` and a warning.
- **Partial results.** If access fails mid-run, listings already delivered are kept and charged; nothing else is.

### Legal and personal data

This Actor collects listing information that HAR.com shows publicly, without logging in. Listings include the names and office phone numbers of listing agents and brokerages. Review HAR.com's terms, MLS data rules and the privacy laws that apply to you before you store or reuse the data, and do not use agent contact details for unsolicited bulk messaging.

### FAQ

**Is there a free HAR.com scraper?**
You can try this one on Apify's free plan. Free-plan runs pay the normal per-listing and start prices from the free monthly credit and have the same 500-listing maximum per run as paid plans.

**How much does it cost to scrape HAR.com listings?**
$0.004 per listing on the FREE tier ($0.0032 on GOLD and above), which is $4 per 1,000 listings, plus a $0.005 start fee per run. 500 listings cost $2.005 on FREE.

**Can I scrape only single-family homes for sale on HAR.com?**
Yes. Set `propertyType` to `Single-Family`, optionally with a price range and `minBedrooms`. The same works for townhouses, condos, multi-family, land and acreage.

**Can it scrape HAR.com homes for rent?**
No. The Actor is built and tested for for-sale searches only.

### Support

Open an issue on the Actor's Issues tab with the run ID and the `OUTPUT` record, especially if HAR.com pages change or a field comes back empty.

Last verified: 2026-11-04

# Actor input Schema

## `city` (type: `string`):

Use this for a city-wide HAR.com for-sale search, for example Houston, Katy or Boerne. HAR.com covers the Houston region best. Ignored when startUrls are given. If city, zipCode and startUrls are all empty, the Actor searches Houston.

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

Use this for a five-digit Texas ZIP code search, for example 77002. With a city it narrows the city search; with startUrls it only keeps listings in this ZIP.

## `startUrls` (type: `array`):

Use this when you already have HAR.com search-result pages, for example https://www.har.com/houston/realestate/for_sale or https://www.har.com/zipcode_77002/realestate/for_sale. Single-listing (homedetail) pages are not accepted. Up to 20 URLs; takes precedence over city.

## `minPrice` (type: `integer`):

Keep listings priced at or above this amount, for example 250000.

## `maxPrice` (type: `integer`):

Keep listings priced at or below this amount, for example 400000.

## `minBedrooms` (type: `integer`):

Keep listings with at least this many bedrooms, for example 3.

## `propertyType` (type: `string`):

Limit results to one HAR.com property class, for example Single-Family for single-family homes for sale. Any returns every class.

## `maxResults` (type: `integer`):

Maximum listings to return (1-500). Each search page holds up to 120 listings.

## `enrichDetails` (type: `boolean`):

Also open each listing page to add the public description and listing-page photos (best effort; slower). Search results already include price, address, beds, baths, size, coordinates, MLS number, agent and brokerage.

## `maxDetailPages` (type: `integer`):

When enrichDetails is on, open at most this many listing pages (0-50), starting with the first results.

## Actor input object example

```json
{
  "city": "Houston",
  "propertyType": "Any",
  "maxResults": 3,
  "enrichDetails": false,
  "maxDetailPages": 10
}
```

# Actor output Schema

## `listings` (type: `string`):

One record per HAR.com listing.

## `summary` (type: `string`):

Run status (DATA, EMPTY, BLOCKED, REJECTED or FAILED), counts, access path and warnings.

# 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 = {
    "city": "Houston",
    "maxResults": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/har-texas-real-estate-scraper").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 = {
    "city": "Houston",
    "maxResults": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/har-texas-real-estate-scraper").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 '{
  "city": "Houston",
  "maxResults": 3
}' |
apify call muhammadafzal/har-texas-real-estate-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/har-texas-real-estate-scraper"
        }
    }
}
```

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/YZr5emcgmvXEPiazM/builds/rjZd9lnvQbv9jsvO2/openapi.json
