# NewHomeSource.com Scraper \[$1.50/1k] (`memo23/newhomesource-scraper`) Actor

\[$1.50/1k] NewHomeSource all-in-one scraper. Pick any US state and get every new home, floor plan, builder, and community in one flat CSV/JSON row — 33 fields covering specs, price, address, lat/lon, phone, builder ID, community context. Bot-defense resilient with auto-retry. Pure HTTP, no browser.

- **URL**: https://apify.com/memo23/newhomesource-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Automation, Agents
- **Stats:** 4 total users, 2 monthly users, 83.3% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

## NewHomeSource Real Estate Scraper — New Homes, Builders, Floor Plans & Communities

### How It Works

![How NewHomeSource Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-newhomesource.png)

All-in-one [NewHomeSource.com](https://www.newhomesource.com) scraper — pick any US state and the actor walks every market area, every community, and every home / floor-plan inside it. Output: one flat row per home with 33 fields covering home specs, community context, builder, location, and source URLs. JSON + CSV.

| Input | Row(s) emitted |
|---|---|
| **State** (e.g. `Texas`, `Florida`, `California`) | **N home rows** — one per new home or floor plan available across that state's markets |
| **Start URLs** — specific community URLs (`/community/...`, `/basiccommunity/...`) | **N home rows per community URL** — one per home/plan in that community |
| **Start URLs** — specific home URLs (`/plan/...`, `/specdetail/...`, `/basichome/...`) | **1 home row per URL** (community-rollup fields will be empty) |

> Pure HTTP. No Puppeteer, no Playwright, no headless Chromium, no third-party CAPTCHA-bypass service.

---

### Why Use This Scraper?

- **All-in-one state coverage.** Pick `Florida` once and get every market (Orlando, Miami, Tampa…), every community, every home, every floor plan — no URL juggling, no per-market job orchestration.
- **Builder + community + home in one row.** Most competing approaches give you community listings *or* home listings. This actor flattens them: each row carries the home's own price + size + beds + baths, the community's price band + floor-plan count + total homes, and the builder's name + ID + phone.
- **Geo-ready.** Latitude + longitude on every row, plus full street address, zip, state. Drop straight into your map / heatmap / territory-analysis pipeline.
- **Bot-defense resilient.** Auto-retry HTTP pipeline gets past NewHomeSource's protection layer without spinning up a browser.
- **JSON or CSV out.** No glue code. Connect to your warehouse, BI tool, or spreadsheet in one step.

---

### Overview

NewHomeSource is the largest US new-construction listings site, operated by Builders Digital Experience (Move, Inc.). It indexes new-build homes, floor plans, communities, and builders across all 50 states.

This actor produces a **single flat row shape** — one record per home or floor plan. Each row denormalizes the community-level and builder-level context, so a single CSV is enough for downstream analytics (no joins required).

**Coverage scope.** The actor walks: State landing page → market areas (metro regions) → community detail pages → individual home / plan pages. Each home detail page is parsed for the structured data already embedded in the response, with DOM fallbacks for basic plan / spec pages that render the same content in a different shape.

---

### Supported Inputs

The `state` input accepts any of the 50 US states by full name (e.g. `Texas`, `Florida`, `California`). The actor will:

1. Visit the state's all-communities listing and walk it page by page (40 communities per page).
2. For each community, extract its profile + builder + the list of available homes / floor plans.
3. For each home / floor plan, fetch the detail page and emit the 33-field row.

One state per run — if you need multiple states, schedule the actor with different state values via Apify scheduler. Use the `maxItems` cap below to keep cost predictable on big states.

**Not supported:** custom `startUrls`. The actor is state-driven only. If you need URL-driven scraping (e.g. "scrape these 200 specific communities"), open an issue (link below) — that's a roadmap candidate.

---

### Use Cases

| Audience | What they use it for |
|---|---|
| **Real estate professionals** | Daily/weekly snapshots of available new construction in target markets — pricing trends, builder presence, inventory levels |
| **Home builders** | Competitive monitoring — which builders are active in which markets at what price points |
| **Market researchers** | New-construction supply data by state/metro/zip — input to housing reports |
| **Lead-generation / B2B sales** | Builder contact data + community-level phone numbers for outreach |
| **MLS / proptech competitors** | Aggregating new-build inventory that doesn't always appear in MLS |
| **Property data warehouses** | Adding new-construction layer to existing resale-focused datasets |

---

### Input Configuration

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `state` | enum | no | `"Alabama"` | One of the 50 US states. Dropdown in the Apify UI. The actor walks state → markets → communities → homes end-to-end. **Optional** when `startUrls` is set. |
| `startUrls` | string[] | no | `[]` | List of specific NewHomeSource URLs to scrape. Accepts **community URLs** (`/community/{state}/.../{id}`, `/basiccommunity/community-{id}/...`) — each emits every home/plan in that community — and **home URLs** (`/plan/...`, `/specdetail/...`, `/basichome/...`) — each emits one row. Can be combined with `state`: state walk runs first, then the URL list. |
| `maxItems` | integer | no | `0` (unlimited) | Hard cap on the total home rows pushed in one run (applies across state walk + URL list combined). |
| `maxConcurrency` | integer | no | `10` | Max parallel page fetches across the funnel. |
| `minConcurrency` | integer | no | `1` | Lower bound for adaptive concurrency. |
| `maxRequestRetries` | integer | no | `3` | Per-request retry budget. |
| `proxy` | object | no | Apify Residential | Standard Apify proxy configuration. **Residential proxies strongly recommended** — datacenter IPs are flagged on first request by this site's bot detection. |

#### Example input

**State mode** — walk an entire state end-to-end:

```json
{
  "state": "Missouri",
  "maxItems": 2000,
  "maxConcurrency": 10,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
````

That walks Missouri's entire new-construction inventory, capped at 2,000 home rows.

**URL mode** — scrape only specific communities (no state walk):

```json
{
  "startUrls": [
    "https://www.newhomesource.com/community/id/kuna/medallion-at-valor-by-tresidio-homes/202479",
    "https://www.newhomesource.com/community/al/talladega/cornerstone-meadows-by-smith-douglas-homes/199856"
  ],
  "maxConcurrency": 5,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

Each community URL emits one row per home/plan in that community. Skip the `state` field entirely when running in URL mode.

**Home URL mode** — pull single home/plan pages directly:

```json
{
  "startUrls": [
    "https://www.newhomesource.com/plan/the-pearson-smith-douglas-homes-columbiana-al/2787050",
    "https://www.newhomesource.com/specdetail/1379-barret-park-way-montgomery-al-36117/2777927",
    "https://www.newhomesource.com/basichome/pembrook-overland-park-ks/p3305873"
  ]
}
```

One row per URL. Community-rollup fields (Total Floor Plans, Community Min/Max Home Price, etc.) will be empty — those come from the community detail page which we're skipping in this mode.

**Combined mode** — state walk *plus* extra communities of interest in one job:

```json
{
  "state": "Idaho",
  "startUrls": [
    "https://www.newhomesource.com/community/id/kuna/medallion-at-valor-by-tresidio-homes/202479",
    "https://www.newhomesource.com/community/al/talladega/cornerstone-meadows-by-smith-douglas-homes/199856"
  ]
}
```

Bump `maxConcurrency` only if your proxy plan can take the parallel load — Apify Residential handles 10 comfortably.

***

### Output Overview

Single flat shape: **33 fields per row**, one row per home / floor plan. Fields are alphabetically sorted in the CSV header so column order is stable across runs (e.g. `BA` → `BR` → `Builder` → `Builder ID` → … → `Zip Code`).

Both formats are written automatically at end of run:

- **`data.json`** — array of row objects in the Apify key-value store.
- **`data.csv`** — same rows as CSV, header row included, ready for Excel / Sheets / Snowflake / BigQuery.

***

### Output Samples

Real row from a Missouri run (Lombardo Homes' "The Becket" floor plan in the South Wind community, Ashland MO):

```jsonc
{
  "BA": "2",
  "BR": "3",
  "Builder": "Lombardo Homes Missouri",
  "Builder ID": "74278",
  "Community Address": "Talladega Dr, Ashland, MO 65010 Ashland, MO 65010",
  "Community ID": 221963,
  "Community Max Home Price": 540000,
  "Community Max Home Size": 2968,
  "Community Min Home Price": 298000,
  "Community Min Home Size": 1655,
  "Community Name": "South Wind",
  "Floor Plan": "The Becket",
  "GA": 2,
  "Latitude": "38.756352",
  "Longitude": "-92.256633",
  "New Home Address": "Talladega Dr, Ashland, MO 65010",
  "New Home Price": "316000",
  "New Home Size": 1721,
  "Notes": "About South Wind. Lombardo Homes is excited to offer homesites in the desirable South Wind community in Ashland, Missouri! …",
  "Phone": "888-928-7606",
  "QMI Count": 1,
  "ST": 1,
  "Secondary Count": 1,
  "State": "MO",
  "Status": "Normal",
  "Subtype": "SBC",
  "Total Count": 1,
  "Total Floor Plans": 10,
  "Type": "Place",
  "URL 1": "https://nhs-dynamic-secure.akamaized.net/Images/Homes/Lomba11476/106564452-260320.jpg",
  "URL 2": "https://www.newhomesource.com/community/mo/ashland/south-wind-by-lombardo-homes-missouri/221963",
  "URL 3": "https://www.newhomesource.com/plan/the-becket-lombardo-homes-missouri-ashland-mo/3790637",
  "Zip Code": "65010"
}
```

***

### Key Output Fields

Grouped by category. All field names match the column header in `data.csv` exactly.

#### Home specs (this individual home or floor plan)

- `Floor Plan` — plan name (e.g. "The Becket")
- `BR` — bedrooms
- `BA` — bathrooms
- `GA` — garage car count
- `ST` — number of stories
- `New Home Size` — square feet for this specific plan
- `New Home Price` — list price for this plan
- `Status` — current marketing status (e.g. "Normal", "Coming Soon", "Hot Deal")
- `Type` / `Subtype` — schema.org type + NewHomeSource subtype code

#### Community context (rolled up across the community)

- `Community Name` — community / subdivision name (e.g. "South Wind")
- `Community ID` — NewHomeSource numeric ID
- `Community Address` — community-level street address
- `Community Min Home Price` / `Community Max Home Price` — price band across all homes
- `Community Min Home Size` / `Community Max Home Size` — size band (sq ft)
- `Total Count` / `Secondary Count` — home counts at the community
- `Total Floor Plans` — number of distinct plans offered
- `QMI Count` — quick-move-in inventory count
- `Notes` — community description / marketing copy

#### Location

- `Latitude` / `Longitude` — geocoordinates (string)
- `New Home Address` — street address for this specific home
- `State` — 2-letter state abbreviation (e.g. "MO")
- `Zip Code` — 5-digit zip

#### Builder

- `Builder` — builder display name (e.g. "Lombardo Homes Missouri")
- `Builder ID` — NewHomeSource numeric builder ID
- `Phone` — community / builder contact number

#### Media + source URLs

- `URL 1` — listing image (Akamai-hosted, full resolution)
- `URL 2` — community detail page on NewHomeSource
- `URL 3` — plan / spec detail page on NewHomeSource

***

### FAQ

**Q: Why is the input a state instead of a URL list?**
A: NewHomeSource is structured top-down (state → market → community → home), and the easiest way to get comprehensive new-build coverage is to walk that tree. If you need URL-driven scraping for specific communities or builders, file an issue — that's on the roadmap.

**Q: Can I scrape multiple states in one run?**
A: One state per run by design. To cover multiple states, schedule the actor with different `state` values via the Apify scheduler (or call it from your own orchestration). Per-run is cleaner: predictable cost, easy debugging, isolated failure if one state's landing page hiccups.

**Q: Can I scrape specific communities without walking a whole state?**
A: Yes — use the **`startUrls`** input. Paste any mix of community URLs (`/community/...`, `/basiccommunity/...`) and the actor processes only those, emitting one row per home in each. You can also pass individual home URLs (`/plan/...`, `/specdetail/...`, `/basichome/...`) — each emits one row, but community-rollup fields (Total Floor Plans, Community Min/Max Home Price, etc.) will be empty because those come from the community detail page.

**Q: What if I set both `state` and `startUrls`?**
A: Both run in the same job — state walk first, then the URL list. The `maxItems` cap applies to the combined total. Useful when you want full coverage of one state plus specific competing communities elsewhere.

**Q: How long does a full state take?**
A: Depends on the state. Texas / Florida / California have 20+ markets and tens of thousands of listings; small states like Wyoming or Vermont may have 1-3 markets and a few hundred listings. Plan on 10-60 minutes for typical states with `maxConcurrency: 10` on Apify Residential.

**Q: Why do I need residential proxies?**
A: NewHomeSource runs commercial bot detection that flags datacenter IPs on first request. Residential proxies (Apify Residential, or any reputable residential provider) work; standard non-residential proxies do not.

**Q: What happens if a specific home page gets blocked?**
A: The per-URL retry budget is generous (up to ~100 attempts). If all retries fail, the URL is logged to `failed-requests.json` and skipped — the rest of the run continues. Expect 80-95% completion on typical states; the tail is usually URLs that 404 anyway.

**Q: Does the output include open-house dates / lot maps / virtual tours?**
A: Not in the current schema. The actor focuses on the structured "home record" data (specs, prices, addresses, builder). Open houses + lot maps + tour links require deeper page parsing — open an issue if you need them.

**Q: Is the data refreshed in real time?**
A: Each run pulls live data from NewHomeSource as of run time. There's no caching; if you run the actor at 9am and again at 9pm, you'll see any inventory changes between those snapshots. For continuous monitoring, schedule the actor with Apify scheduler.

**Q: Does it pick up the QMI (Quick Move-In) homes vs floor plans?**
A: Both. The community detail page extracts the home list which includes spec/QMI homes and buildable plans; both are emitted as rows. The `Status` field distinguishes them (e.g. QMI-flagged homes vs plans).

***

### Support

- **Bug reports / feature requests:** open an issue at [the GitHub repo](https://github.com/muhamed-didovic) or use the **Issues** tab on the Apify Store listing.
- **Custom field requests** (e.g. add open-house dates, lot maps, virtual tour URLs): contact via the Apify Store messaging.
- **Email:** `muhamed.didovic@gmail.com`

***

### Additional Services

Need something off-the-shelf doesn't cover? Custom services available:

- **URL-driven scraping** — scrape specific community / builder URLs instead of state-wide
- **Incremental / change-detection runs** — diff against last run, emit only new + changed listings
- **Builder enrichment** — augment rows with builder portfolio data, ratings, license info
- **Other real-estate sources** — Zillow, Redfin, Trulia, Realtor.com, broker-direct sites
- **Data delivery to your warehouse** — Snowflake / BigQuery / S3 / Postgres direct push

Reach out via the Apify Store contact or email.

***

### Explore More Scrapers

- [Capterra Software Reviews Scraper](https://apify.com/memo23/capterra-cheerio-ppr) — product / reviews / category / compare URLs, 4-shape output
- [TrustRadius Reviews Scraper](https://apify.com/memo23/trustradius-cheerio-ppr) — vendor + reviews + category + best-of-lists
- [TotalJobs Jobs Search Scraper](https://apify.com/memo23/totaljobs-cheerio-ppr) — UK jobs by keyword/location/URL
- [Stepstone Jobs Search Scraper](https://apify.com/memo23/stepstone-search-cheerio-ppr) — DACH + EU jobs by URL/keywords

***

### ⚠️ Disclaimer

This Actor accesses publicly available data on NewHomeSource.com for legitimate research, market intelligence, and business-analysis purposes. NewHomeSource.com is operated by Builders Digital Experience, LLC, a subsidiary of Move, Inc. This Actor is **not affiliated with, endorsed by, or sponsored by** NewHomeSource, Builders Digital Experience, or Move, Inc. All trademarks are the property of their respective owners.

Use of this Actor must comply with NewHomeSource's Terms of Service and all applicable laws including data protection regulations (GDPR, CCPA, etc.). The Actor's authors are not responsible for any misuse. Users must:

- Respect rate limits and avoid overloading NewHomeSource's infrastructure
- Not use scraped data to violate user privacy or terms
- Use the data in compliance with applicable jurisdictions
- Not republish scraped content in violation of copyright
- Not impersonate, harass, or contact builders or sellers via scraped phone numbers without their consent

We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use.

***

### SEO Keywords

newhomesource scraper, newhomesource.com scraper, new home listings scraper, new construction homes data, new homes for sale scraper, home builder data scraper, real estate listings api, new construction listings api, builder directory scraper, floor plans scraper, community listings scraper, MLS alternative new construction, real estate market data, housing inventory data, new build inventory scraper, residential construction data, home builder leads, real estate data extraction, real estate web scraping, Apify scraper, no-code scraper, JSON CSV real estate export, US new homes data, property data api

# Actor input Schema

## `state` (type: `string`):

Pick a US state to walk end-to-end: every community in the state → every home. Big states (Texas / Florida / California) can produce 30,000+ rows — use the Max items knob below to cap cost.<br><br><b>Leave blank if you only want the Start URLs below to be scraped</b> — otherwise the state walk runs in addition to your URLs and you'll get extra rows from this state on top of the URL results.

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

List of specific NewHomeSource URLs to scrape. Accepted URL kinds:<br><br><b>Community URLs</b> (one row per home/plan in that community):<br>• <code>https://www.newhomesource.com/community/{state}/.../{id}</code><br>• <code>https://www.newhomesource.com/basiccommunity/community-{id}/...</code><br><br><b>Home URLs</b> (one row per URL — note: community-rollup fields like price band / floor plan count will be empty):<br>• <code>https://www.newhomesource.com/plan/...</code><br>• <code>https://www.newhomesource.com/specdetail/...</code><br>• <code>https://www.newhomesource.com/basichome/...</code><br><br>Can be combined with <b>State</b> — state walk runs first, then the URL list. Leave blank for state-only mode.

## `homeTypes` (type: `array`):

Which kinds of listings to include in the output. Both checked by default — uncheck whatever you don't need.<br><br><b>Floor plans</b> — the builder's catalog of plans you can order (URL contains <code>/plan/</code>).<br><b>QMI / Spec homes</b> — Quick Move-In homes, already built or under construction (URL contains <code>/specdetail/</code> or <code>/basichome/</code>).<br><br>Filter is applied early — when only one type is selected, the scraper skips the fetches for the other type entirely so you don't pay for unused rows.

## `maxItems` (type: `integer`):

Hard cap on the total number of home rows pushed in a single run. Leave 0 / unset for unlimited. Use this to keep cost predictable on big states.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.newhomesource.com/community/id/kuna/medallion-at-valor-by-tresidio-homes/202479",
    "https://www.newhomesource.com/community/al/talladega/cornerstone-meadows-by-smith-douglas-homes/199856",
    "https://www.newhomesource.com/plan/the-pearson-smith-douglas-homes-columbiana-al/2787050"
  ],
  "homeTypes": [
    "floorplan",
    "qmi"
  ],
  "maxItems": 0,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 3,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "startUrls": [
        "https://www.newhomesource.com/community/id/kuna/medallion-at-valor-by-tresidio-homes/202479",
        "https://www.newhomesource.com/community/al/talladega/cornerstone-meadows-by-smith-douglas-homes/199856",
        "https://www.newhomesource.com/plan/the-pearson-smith-douglas-homes-columbiana-al/2787050"
    ],
    "homeTypes": [
        "floorplan",
        "qmi"
    ],
    "maxItems": 0,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/newhomesource-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 = {
    "startUrls": [
        "https://www.newhomesource.com/community/id/kuna/medallion-at-valor-by-tresidio-homes/202479",
        "https://www.newhomesource.com/community/al/talladega/cornerstone-meadows-by-smith-douglas-homes/199856",
        "https://www.newhomesource.com/plan/the-pearson-smith-douglas-homes-columbiana-al/2787050",
    ],
    "homeTypes": [
        "floorplan",
        "qmi",
    ],
    "maxItems": 0,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/newhomesource-scraper").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 '{
  "startUrls": [
    "https://www.newhomesource.com/community/id/kuna/medallion-at-valor-by-tresidio-homes/202479",
    "https://www.newhomesource.com/community/al/talladega/cornerstone-meadows-by-smith-douglas-homes/199856",
    "https://www.newhomesource.com/plan/the-pearson-smith-douglas-homes-columbiana-al/2787050"
  ],
  "homeTypes": [
    "floorplan",
    "qmi"
  ],
  "maxItems": 0,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/newhomesource-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "NewHomeSource.com Scraper [$1.50/1k]",
        "description": "[$1.50/1k] NewHomeSource all-in-one scraper. Pick any US state and get every new home, floor plan, builder, and community in one flat CSV/JSON row — 33 fields covering specs, price, address, lat/lon, phone, builder ID, community context. Bot-defense resilient with auto-retry. Pure HTTP, no browser.",
        "version": "1.0",
        "x-build-id": "FnDl54XBz9kTI7qsr"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~newhomesource-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-newhomesource-scraper",
                "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/memo23~newhomesource-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-newhomesource-scraper",
                "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/memo23~newhomesource-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-newhomesource-scraper",
                "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": {
                    "state": {
                        "title": "State (optional if Start URLs is set)",
                        "enum": [
                            "Alabama",
                            "Alaska",
                            "Arizona",
                            "Arkansas",
                            "California",
                            "Colorado",
                            "Connecticut",
                            "Delaware",
                            "Florida",
                            "Georgia",
                            "Hawaii",
                            "Idaho",
                            "Illinois",
                            "Indiana",
                            "Iowa",
                            "Kansas",
                            "Kentucky",
                            "Louisiana",
                            "Maine",
                            "Maryland",
                            "Massachusetts",
                            "Michigan",
                            "Minnesota",
                            "Mississippi",
                            "Missouri",
                            "Montana",
                            "Nebraska",
                            "Nevada",
                            "New Hampshire",
                            "New Jersey",
                            "New Mexico",
                            "New York",
                            "North Carolina",
                            "North Dakota",
                            "Ohio",
                            "Oklahoma",
                            "Oregon",
                            "Pennsylvania",
                            "Rhode Island",
                            "South Carolina",
                            "South Dakota",
                            "Tennessee",
                            "Texas",
                            "Utah",
                            "Vermont",
                            "Virginia",
                            "Washington",
                            "West Virginia",
                            "Wisconsin",
                            "Wyoming"
                        ],
                        "type": "string",
                        "description": "Pick a US state to walk end-to-end: every community in the state → every home. Big states (Texas / Florida / California) can produce 30,000+ rows — use the Max items knob below to cap cost.<br><br><b>Leave blank if you only want the Start URLs below to be scraped</b> — otherwise the state walk runs in addition to your URLs and you'll get extra rows from this state on top of the URL results."
                    },
                    "startUrls": {
                        "title": "Start URLs (optional)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "List of specific NewHomeSource URLs to scrape. Accepted URL kinds:<br><br><b>Community URLs</b> (one row per home/plan in that community):<br>• <code>https://www.newhomesource.com/community/{state}/.../{id}</code><br>• <code>https://www.newhomesource.com/basiccommunity/community-{id}/...</code><br><br><b>Home URLs</b> (one row per URL — note: community-rollup fields like price band / floor plan count will be empty):<br>• <code>https://www.newhomesource.com/plan/...</code><br>• <code>https://www.newhomesource.com/specdetail/...</code><br>• <code>https://www.newhomesource.com/basichome/...</code><br><br>Can be combined with <b>State</b> — state walk runs first, then the URL list. Leave blank for state-only mode.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "homeTypes": {
                        "title": "Home types to include",
                        "minItems": 1,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Which kinds of listings to include in the output. Both checked by default — uncheck whatever you don't need.<br><br><b>Floor plans</b> — the builder's catalog of plans you can order (URL contains <code>/plan/</code>).<br><b>QMI / Spec homes</b> — Quick Move-In homes, already built or under construction (URL contains <code>/specdetail/</code> or <code>/basichome/</code>).<br><br>Filter is applied early — when only one type is selected, the scraper skips the fetches for the other type entirely so you don't pay for unused rows.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "floorplan",
                                "qmi"
                            ],
                            "enumTitles": [
                                "Floor plans (/plan/)",
                                "QMI / Spec homes (/specdetail/, /basichome/)"
                            ]
                        },
                        "default": [
                            "floorplan",
                            "qmi"
                        ]
                    },
                    "maxItems": {
                        "title": "Max items (per run)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap on the total number of home rows pushed in a single run. Leave 0 / unset for unlimited. Use this to keep cost predictable on big states.",
                        "default": 0
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "type": "integer",
                        "description": "Maximum number of pages that can be processed at the same time.",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min Concurrency",
                        "type": "integer",
                        "description": "Minimum number of pages that will be processed at the same time.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "type": "integer",
                        "description": "Number of times the crawler will retry a failed request before giving up.",
                        "default": 3
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
