# Lennar Scraper - New Homes, Prices, Floor Plans & Communities (`abotapi/lennar-scraper`) Actor

Scrape Lennar (lennar.com) new-home communities, move-in-ready homes and floor plans by state or URL. Extract 50+ fields including prices, monthly payments, price drops, beds, baths, square footage, GPS coordinates, amenities and virtual tours.

- **URL**: https://apify.com/abotapi/lennar-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 listing 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/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

## Lennar Scraper: New-Home Communities, Move-In-Ready Homes & Floor Plans

Lennar Scraper turns lennar.com into a structured new-construction data feed. Pull whole US states of communities and master-planned communities, move-in-ready homes with firm prices and full monthly-payment breakdowns, and (on request) floor plans with specs, elevation images and virtual tours. Search by state or paste lennar.com links, then export to JSON, CSV or Excel, or pull results straight into your app through the API.

### Why This Scraper?

- **Three record types, one run.** Communities and master-planned communities (neighbourhood summaries), move-in-ready homes (available homes with firm prices), and floor plans (specs, elevations, virtual tours, walkthroughs).
- **Whole states in one pass.** One state returns every community and every available home Lennar lists there, from a handful up to thousands of records.
- **35+ fields per record**, including a full estimated monthly payment breakdown (principal and interest, property tax, home insurance, mortgage insurance, HOA), original vs current price so you can spot price drops, plan starting prices, badges, and GPS coordinates.
- **Search or URL mode.** Pick states from a list, or paste any lennar.com/new-homes state page or community page.
- **Optional floor-plan detail crawl.** Turn it on to also collect per-plan specs, elevation images, virtual tours, community amenities and sales consultants.
- **Built-in cost controls.** A hard record cap and an optional residential-traffic budget keep trial runs small and predictable.
- **Nothing silently dropped.** Search results carry the full source object under `raw`.

### Use Cases

- **Homebuilder market research:** track price drops, price-per-square-foot and inventory levels across states and communities.
- **Real estate investment analysis:** compare firm prices, monthly payment breakdowns and square footage between move-in-ready homes.
- **Mortgage and lending tools:** feed the estimated monthly payment breakdown into calculators and affordability models.
- **Local market dashboards:** monitor community status, badges and available-home counts for a state or metro over time.
- **Content and lead-gen sites:** build floor-plan pages with specs, elevation images and virtual tour links.

### Data You Get

> Sample shapes below. Values are illustrative placeholders, not from a live listing.

| Field | Example |
| --- | --- |
| `recordType` | `"community"` (also `"homesite"`, `"plan"`) |
| `id` | `"c_20441"` |
| `resultKind` | `"mpc"` (also `"community"`; community records only) |
| `communityName` / `mpcName` | `"Sample Ranch"` |
| `state` / `stateCode` | `"Florida"` / `"FL"` |
| `city` / `market` | `"Sample City"` / `"XYZ"` |
| `status` | `"ACTIVE"` (also `"MOVE_IN_READY"`, `"SOLD"`) |
| `badge` | `"Amenity Rich"` (also `"Quick Move-In"` on homes) |
| `priceLabel` / `priceFrom` | `"From the $300s"` / `"From $325K"` |
| `bedRange` / `bathRange` / `sqftRange` | `"3 - 5"` / `"2 - 3"` / `"1,600 - 3,200 sq. ft."` |
| `address` | `"100 Sample Drive #101"` (homesite records) |
| `price` / `wasPrice` / `priceDrop` | `345000` / `365000` / `20000` |
| `beds` / `baths` / `halfBaths` / `sqft` | `3` / `2` / `0` / `1741` |
| `planName` / `planStartingPrice` | `"Sample Plan"` / `313000` |
| `estimatedMonthlyPayment` | `{ principalAndInterest, propertyTax, homeInsurance, mortgageInsurance, approximateHoaFee }` |
| `estimatedMonthlyTotal` | `2450.5` |
| `latitude` / `longitude` | `29.6500` / `-81.2000` |
| `elevationImages` | `[ { title, desc, url } ]` (plan records, floor-plan crawl) |
| `virtualTourUrl` | `"https://www.lennar.com/..."` (plan records, floor-plan crawl) |
| `amenities` / `consultants` | community amenities and sales-consultant names (on a pasted community URL's own record, or nested under `communityContext` on floor-plan records) |
| `url` | `"https://www.lennar.com/new-homes/florida/sample-market/sample-city/sample-ranch"` |
| `raw` | the complete source object |

Community records also carry an overview, hero image, ZIP code, Google place id, property types, division and community numbers, an mpc id and map bounds, plus a sub-community count and list on master-planned communities. Homesite records also carry a lot id, formatted price, move-in-ready and "home of the week" flags, offer availability and end date, the community's price range, and a page-views signal. Floor-plan records also carry a plan number, available-homesite count, a highlighted attribute, a "next generation" flag, a video tour link, a walkthrough flag and object, floorplan images, and the same community context (phone, email, site-plan PDF, mortgage-prequalification link) captured for the community it belongs to.

### How to Use

1. Pick a **mode**: `search` (pick states) or `url` (paste links).
2. Fill in the fields for that mode, and switch on floor plans if you want per-plan detail.
3. Set **Max records** and, if you want one, a residential traffic budget, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**Search two states, communities and homes only:**

```json
{
  "mode": "search",
  "states": ["Florida", "Texas"],
  "includeCommunities": true,
  "includeHomesites": true,
  "enrichDetails": false,
  "maxItems": 100
}
```

**Full floor-plan detail crawl for one state (community and home records off so the whole cap goes to plans):**

```json
{
  "mode": "search",
  "states": ["Arizona"],
  "includeCommunities": false,
  "includeHomesites": false,
  "enrichDetails": true,
  "maxItems": 200
}
```

**Paste a state landing page:**

```json
{
  "mode": "url",
  "startUrls": ["https://www.lennar.com/new-homes/north-carolina"],
  "includeCommunities": true,
  "includeHomesites": true
}
```

**Paste one community page for its floor plans:**

```json
{
  "mode": "url",
  "startUrls": ["https://www.lennar.com/new-homes/texas/example-market/example-city/example-community"],
  "includeCommunities": true
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/lennar-scraper").call(run_input={"mode": "search", "states": ["Florida"], "maxItems": 50})
for record in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(record["recordType"], record.get("communityName") or record.get("address"), record.get("price"))
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/lennar-scraper').call({ mode: 'search', states: ['Florida'], maxItems: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Cost controls and repeat runs

**Max records** caps the whole run; set it to `0` for no limit, which can be thousands of records per state. A **residential traffic budget** (MB) is available separately: once it is spent, the run stops paging through further state results and skips the floor-plan crawl, though a pasted community page and a crawl already underway are not bounded by it, so treat the cap as approximate rather than a hard stop. To track changes on a schedule, switch on **Incremental mode** (see below); without it every run returns the full scope again.

**Incremental mode.** Switch on `incrementalMode` and schedule the same input. The actor keeps a saved baseline per search scope (or per `stateKey`) and labels every record `NEW`, `UPDATED` (with `changedFields`), `UNCHANGED`, `REAPPEARED` or `EXPIRED`, with `firstSeenAt` and `lastSeenAt`. Unchanged records are not output and not charged unless you switch on `emitUnchanged`. `EXPIRED` records (listings that disappeared) are output only when a run covered its whole scope; a run stopped by Max records or by a failed page never reports removals. A change is detected by comparing every extracted field except the raw payload; list further fields in `ignoreFieldsForChanges` to stop them counting as a change. With incremental mode off, output is identical to before. `resumeFromRunId` continues an earlier run that stopped early without collecting its records twice.

#### URL mode shapes

In `url` mode with the URLs field left untouched, the actor scrapes the default example set (one example per shape below; the promo example is always skipped with a warning) instead of stopping with a no-input message. Replace it with your own links at any time. Links that cover the same community or area are collected once: a community that appears both in a state or metro page and as its own page produces a single record.

| URL shape | Example | Behaviour |
| --- | --- | --- |
| State page (also trailing slash, `http://lennar.com`) | lennar.com/new-homes/florida | Collects the whole state |
| State page by product type | lennar.com/new-homes/florida-singlefamily | Collects the whole state; the product-type filter is not applied (a warning is logged) |
| Metro page | lennar.com/new-homes/florida/miami | Collects that metro's communities and homes |
| Community page | lennar.com/new-homes/florida/tampa-manatee/land-o-lakes/angeline | Community detail and floor plans |
| Active-adult community page | .../angeline-active-adult | Community detail and floor plans |
| Home / plan page | .../villas-de-san-diego/azure/25118601302 | Extracted if the page carries data, otherwise a warning is logged |
| Trailing-slash or plain-http state link | lennar.com/new-homes/florida/ | Redirected to the canonical state page and collected as a state |
| Promo / offer page | .../promo/jaxlen_bf26 | Skipped with a warning |

#### Enrichment and output views

With **enrichDetails** on (or a pasted community page) each community is fetched once more for floor plans, amenities and consultants. The dataset has separate views for communities, homes, plans and a basic summary. Pricing is as shown live on the Pricing tab; this README does not quote prices.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped records into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where records should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (pick states) or `url` (paste links). |
| `states` | array | `["Florida"]` | US states to scrape in search mode. Each state returns every community and move-in-ready home Lennar lists there. |
| `markets` | array | empty | Narrow each selected state to metro areas by name (for example Miami or Tampa), lennar.com metro slug or market code. Resolved from Lennar's own market list; no match stops the run with an error listing the available markets. Search mode only. |
| `expandToWholeState` | boolean | `false` | When on, `markets` is ignored and whole states are collected. |
| `startUrls` | array | one example URL per supported shape (see URL mode shapes) | lennar.com links to scrape in url mode. |
| `includeCommunities` | boolean | `true` | Output one record per community / master-planned community with price, bed, bath, sqft ranges, badge, brand, status and coordinates. Applies to both modes. |
| `includeHomesites` | boolean | `true` | Output one record per available home with a firm price, full estimated monthly payment breakdown, beds, baths, square footage, plan and status. Applies to both modes. |
| `enrichDetails` | boolean | `false` | Also output one record per floor plan, plus community amenities, and sales consultants. Fetches one extra page per community. A community URL pasted directly in url mode always returns its floor plans regardless of this setting. |
| `maxItems` | integer | `20` | Stop after this many records across the whole run. `0` means no limit (full coverage of every selected state, which can be thousands of records per state). |
| `proxy` | object | `{ "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }` | Connection settings. The default is Apify Proxy's residential group. lennar.com answers datacenter connections only intermittently, so residential is the more reliable choice; see Plan Requirement. |
| `maxResidentialMB` | integer | `0` | Optional cap on residential traffic in MB. After this many MB the run stops paging through further state results and skips the floor-plan crawl, though a pasted community page and a crawl already underway are not bounded by it, so treat the cap as approximate. `0` means no cap. |
| `resumeFromRunId` | string | (none) | ID of an earlier run that stopped early; its records are skipped so nothing is collected twice. |
| `incrementalMode` | boolean | `false` | Label records NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED against a saved baseline; unchanged records are not output or charged. |
| `stateKey` | string | (none) | Name of the saved baseline; empty derives it from the search scope. |
| `emitUnchanged` | boolean | `false` | Incremental mode only: also output UNCHANGED records. |
| `emitExpired` | boolean | `true` | Incremental mode only: output EXPIRED records for listings that disappeared, when a run covers its whole scope. |
| `ignoreFieldsForChanges` | array | empty | Incremental mode only: top-level field names that must not count as a change. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which records are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live listing.

```json
{
  "recordType": "homesite",
  "id": "hs_500123",
  "state": "Florida",
  "stateCode": "FL",
  "status": "MOVE_IN_READY",
  "address": "100 Sample Drive #101",
  "url": "https://www.lennar.com/new-homes/florida/sample-market/sample-city/sample-ranch/100-sample-drive-101",
  "lotId": "L-042",
  "beds": 3,
  "baths": 2,
  "halfBaths": 0,
  "sqft": 1741,
  "price": 345000,
  "wasPrice": 365000,
  "priceDrop": 20000,
  "formattedPrice": "$345,000",
  "badge": "Quick Move-In",
  "isMoveInReady": true,
  "isHotw": false,
  "offerAvailable": true,
  "offerEndDate": "2026-11-30",
  "imageUrl": "https://images.lennar.com/sample/elevation-b.jpg",
  "planName": "Sample Plan",
  "planStartingPrice": 313000,
  "planCustomPrice": null,
  "communityName": "Sample Ranch",
  "communityPriceRange": "From the $300s",
  "mpcName": "Sample Ranch",
  "city": "Sample City",
  "market": "XYZ",
  "divisionNumber": "12",
  "estimatedMonthlyPayment": {
    "principalAndInterest": 1780.5,
    "propertyTax": 320.0,
    "homeInsurance": 145.0,
    "mortgageInsurance": 95.0,
    "approximateHoaFee": 110.0
  },
  "estimatedMonthlyTotal": 2450.5,
  "pageViews": { "total": 812 },
  "latitude": 29.6500,
  "longitude": -81.2000,
  "googlePlaceId": null,
  "raw": {}
}
```

### Plan Requirement

The run defaults to Apify Proxy's residential group. lennar.com sits behind a Cloudflare edge that answers datacenter connections only intermittently: in our measurements a datacenter address got a page roughly one request in three and a block page (HTTP 403, "Attention Required") the rest of the time, so datacenter can work but is not dependable. The actor checks which connection your account can use and, if residential is not available (Apify free plans do not include it), the log says so ("The selected connection is unavailable to this run. Apify free plans do not include residential proxies.") and the run continues on a backup connection; the log then also notes "Served over the backup connection (the default connection was unavailable)." Some pages may still be unavailable on the backup. For dependable results use a paid plan with residential access, or supply your own proxy URLs in the Proxy field.

If nothing could be read, the run fails with one of these messages: the proxy connection was refused for this account (your plan does not include proxy access, or your own proxy URLs have invalid credentials); no results because residential proxies are unavailable and the backup connection could not load the Lennar pages; or a general connection problem where the requests failed (a connection problem, not an empty search), in which case try again later.

### FAQ

#### How much does it cost?

You pay per record returned (community, home or floor plan). Floor-plan records also carry a separate detail-enrichment charge: this fires once per floor-plan record whenever one is produced, whether that is because **Include floor plans** was switched on for a state search or because a single community page was pasted directly in url mode, which always returns its floor plans regardless of that setting. Community and move-in-ready home records are not charged the detail-enrichment fee. The **Pricing** tab shows the current per-event rates. Use **Max records** to cap the cost of any run.

#### Is it legal to scrape Lennar?

This actor collects only publicly available new-home listing data. You are responsible for how you use it: follow lennar.com's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices, specs and availability change frequently and are not guaranteed to be current at the time you read them.

#### Can I run this on a schedule to catch new listings or price changes?

Yes, schedule it from the **Schedules** tab and switch on **Incremental mode**: each run then returns only new, changed and removed records, labelled `NEW`, `UPDATED`, `REAPPEARED` or `EXPIRED`, instead of the full scope again. Keep the same input (or the same `stateKey`) between runs so they share one baseline.

#### Why did my run fail or finish with an empty dataset?

If every request to lennar.com is refused, or a pasted URL or state search page cannot be read, the run is marked as failed (not as an empty success) with one of the messages listed under Plan Requirement, and the same message plus request and error counts is saved in the run's key-value store under `OUTPUT`. A `markets` input that matches no market also fails the run, listing the available markets. If only some requests fail, the run still finishes successfully with whatever records it did collect; check `errors` in `OUTPUT`. Run it again in a few minutes, and check that your plan includes residential proxy or that your own proxy URLs are valid.

#### Can I use it with AI agents or MCP?

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

### 🔗 Want more real estate data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🏠 <a href="https://apify.com/abotapi/drhorton-scraper"><b>DR Horton</b></a><br>Extract new-home data from drhorton.com, America’s largest homebuilder. Pull communities...</td><td>🏠 <a href="https://apify.com/abotapi/newhomesource-scraper"><b>NewHomeSource</b></a><br>Scrape new homes, floor plans, builders and communities from NewHomeSource.com. Search by...</td></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/redfin-scraper"><b>Redfin Scraper</b></a><br>Scrape redfin.com home listings: price, beds, baths, sqft, lot, year built, coordinates...</td><td>🏠 <a href="https://apify.com/abotapi/rent-com-scraper"><b>Rent.com Scraper</b></a><br>Extract rental listings from rent.com. Get comprehensive data including monthly rent...</td></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/onthemarket-scraper"><b>OnTheMarket Scraper</b></a><br>Scrape onthemarket.com for-sale, to-rent and new-homes listings with 85+ fields: price...</td><td>🏠 <a href="https://apify.com/abotapi/zapimoveis-scraper"><b>Zap Imóveis Scraper</b></a><br>Scrape Zap Imóveis sale, rental and new-development listings by city, filters or URL...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/lennar-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

How to choose what to scrape. 'search' iterates the states you pick; 'url' scrapes specific lennar.com/new-homes pages you paste (a state landing page, or a community page for its floor plans).

## `states` (type: `array`):

One or more US states to scrape. Each state returns every community and move-in-ready home Lennar lists there. Only applies in 'search' mode.

## `markets` (type: `array`):

Narrow each selected state to one or more metro areas, by name (for example Miami, Tampa, Pensacola), lennar.com metro slug or market code (MIA). Names are resolved from Lennar's own market list for the selected state; if nothing matches the run stops with an error listing the available markets. Leave empty for the whole state. Search mode only.

## `expandToWholeState` (type: `boolean`):

When on, the markets list is ignored and every community in the selected states is collected. Off (default): only the markets you list. Search mode only.

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

lennar.com URLs to scrape. Supported: a state page (lennar.com/new-homes/florida, also with trailing slash or http://lennar.com) collects that whole state; a product-type state page (florida-singlefamily) collects the whole state (filter not applied, warning logged); a metro page (florida/miami) collects that metro's communities and homes; a community page (incl. -active-adult) returns its floor plans and community detail; a home/plan page is fetched and extracted if it carries data. Promo/offer pages are skipped with a warning. Only applies in 'url' mode.

## `includeCommunities` (type: `boolean`):

Output one record per community / master-planned community with price, bed, bath, sqft ranges, badge, brand, status, and coordinates. Applies in BOTH 'search' and 'url' mode: in url mode it controls the community records from a pasted state page and the community record built from a pasted community page.

## `includeHomesites` (type: `boolean`):

Output one record per available home with a firm price, full estimated monthly payment breakdown (principal & interest, taxes, insurance, HOA), beds, baths, square footage, plan, and status. Applies in BOTH 'search' and 'url' mode: in url mode it covers the state pages you paste (a single community page lists no move-in-ready homes of its own).

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

Output one record per floor plan offered in each community (plan name, specs, elevation images, virtual tour, walkthrough) plus community amenities, and sales consultants. This fetches one extra page per community, so it is slower and billed separately. Leave off for the fast, cheap community + home overview. Applies in BOTH 'search' and 'url' mode: it turns the extra per-community crawl on for the state pages you paste. A community page pasted directly in url mode always returns its floor plans, whatever this is set to.

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

Stop after this many records across the whole run. The default (20) keeps a trial run small and cheap; set 0 for no limit (full coverage of every selected state, which can be thousands of records per state).

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

Connection settings. This source applies edge filtering that rejects datacenter ranges, so Apify Proxy with the RESIDENTIAL group (the default) is required for reliable results.

## `maxResidentialMB` (type: `integer`):

Optional cap on residential traffic. After this many MB, the run stops to avoid extra premium traffic. 0 means no budget cap.

## `resumeFromRunId` (type: `string`):

Optional. Paste the ID of an earlier run of this actor that stopped early; its records are skipped so this run continues where it ended and nothing is collected twice. Leave empty for a normal run.

## `incrementalMode` (type: `boolean`):

Remember what earlier runs collected and label every record NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. UNCHANGED records are not output (and not billed) unless you switch on 'Output unchanged records'. A change is detected by comparing every extracted field except the raw payload and review text, minus the fields you list below. State is kept per search scope, so schedule the same input daily.

## `stateKey` (type: `string`):

Name of the saved baseline. Leave empty to derive it from your search scope (mode, states, markets, links and what-to-collect switches). Set the same key on several differently-shaped runs to share one baseline.

## `emitUnchanged` (type: `boolean`):

Incremental mode only. Also output records that did not change since the last run (labelled UNCHANGED).

## `emitExpired` (type: `boolean`):

Incremental mode only. When a run completes its whole scope, output a record (labelled EXPIRED) for every tracked record that is no longer listed. Skipped when the run stopped early at the item limit.

## `ignoreFieldsForChanges` (type: `array`):

Top-level field names (for example pageViews) that must not make a record count as UPDATED. They stay in the output.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "states": [
    "Florida"
  ],
  "expandToWholeState": false,
  "startUrls": [
    "https://www.lennar.com/new-homes/texas",
    "https://www.lennar.com/new-homes/arizona-singlefamily",
    "https://www.lennar.com/new-homes/florida/miami",
    "https://www.lennar.com/new-homes/florida/tampa-manatee/land-o-lakes/angeline",
    "https://www.lennar.com/new-homes/florida/tampa-manatee/land-o-lakes/angeline-active-adult",
    "https://www.lennar.com/new-homes/florida/miami/miami/villas-de-san-diego/azure/25118601302",
    "https://www.lennar.com/new-homes/florida/jacksonville-st-augustine/green-cove-springs/russell-retreat/trinidad-ii",
    "https://www.lennar.com/new-homes/florida/jacksonville-st-augustine/promo/jaxlen_bf26"
  ],
  "includeCommunities": true,
  "includeHomesites": true,
  "enrichDetails": false,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxResidentialMB": 0,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": true,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `communities` (type: `string`):

No description

## `homes` (type: `string`):

No description

## `plans` (type: `string`):

No description

## `basic` (type: `string`):

No description

# 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 = {
    "mode": "search",
    "states": [
        "Florida"
    ],
    "startUrls": [
        "https://www.lennar.com/new-homes/texas",
        "https://www.lennar.com/new-homes/arizona-singlefamily",
        "https://www.lennar.com/new-homes/florida/miami",
        "https://www.lennar.com/new-homes/florida/tampa-manatee/land-o-lakes/angeline",
        "https://www.lennar.com/new-homes/florida/tampa-manatee/land-o-lakes/angeline-active-adult",
        "https://www.lennar.com/new-homes/florida/miami/miami/villas-de-san-diego/azure/25118601302",
        "https://www.lennar.com/new-homes/florida/jacksonville-st-augustine/green-cove-springs/russell-retreat/trinidad-ii",
        "https://www.lennar.com/new-homes/florida/jacksonville-st-augustine/promo/jaxlen_bf26"
    ],
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    },
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/lennar-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 = {
    "mode": "search",
    "states": ["Florida"],
    "startUrls": [
        "https://www.lennar.com/new-homes/texas",
        "https://www.lennar.com/new-homes/arizona-singlefamily",
        "https://www.lennar.com/new-homes/florida/miami",
        "https://www.lennar.com/new-homes/florida/tampa-manatee/land-o-lakes/angeline",
        "https://www.lennar.com/new-homes/florida/tampa-manatee/land-o-lakes/angeline-active-adult",
        "https://www.lennar.com/new-homes/florida/miami/miami/villas-de-san-diego/azure/25118601302",
        "https://www.lennar.com/new-homes/florida/jacksonville-st-augustine/green-cove-springs/russell-retreat/trinidad-ii",
        "https://www.lennar.com/new-homes/florida/jacksonville-st-augustine/promo/jaxlen_bf26",
    ],
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/lennar-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 '{
  "mode": "search",
  "states": [
    "Florida"
  ],
  "startUrls": [
    "https://www.lennar.com/new-homes/texas",
    "https://www.lennar.com/new-homes/arizona-singlefamily",
    "https://www.lennar.com/new-homes/florida/miami",
    "https://www.lennar.com/new-homes/florida/tampa-manatee/land-o-lakes/angeline",
    "https://www.lennar.com/new-homes/florida/tampa-manatee/land-o-lakes/angeline-active-adult",
    "https://www.lennar.com/new-homes/florida/miami/miami/villas-de-san-diego/azure/25118601302",
    "https://www.lennar.com/new-homes/florida/jacksonville-st-augustine/green-cove-springs/russell-retreat/trinidad-ii",
    "https://www.lennar.com/new-homes/florida/jacksonville-st-augustine/promo/jaxlen_bf26"
  ],
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/lennar-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/lennar-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/2raHQA74GXBrhSgPk/builds/KZQIx5kjUN17ApPga/openapi.json
