LandWatch at a glance
LandWatch is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes change type (incremental mode), changed fields (incremental mode), first seen (incremental mode), last seen (incremental mode) and id, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, Automation, Lead Generation
- Pricing
- $2.20 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 23 options
From $1/1k. Scrape land, farm, ranch, and rural property listings from LandWatch.com. Search by location, price, acreage filters, or URLs. Returns price, acreage, coordinates, description, amenities, price history, photos, seller name, phone, company, and 90+ fields.
What LandWatch $1💰 Land, Farm & Ranch Property Listings can do
- 90+ fields per listing, including the full property description, every amenity, complete price history and every photo URL, not just a summary card.
- Seller contact details on each listing, when published: name, phone, email, license number and company.
- Two ways to collect listings: search by location with filters, or paste exact listing or search URLs.
- Filters for price, acreage, bedrooms, property type and whether a home is included, applied server-side where the site supports it and client-side otherwise.
- Geo coordinates (latitude and longitude) on every listing, for mapping and spatial analysis.
- Recurring monitoring: schedule the actor against the same search and get back only new, updated and, optionally, reappeared or expired listings, so you are not billed again for rows you already have.
Choose what to collect
These inputs let you configure LandWatch $1💰 Land, Farm & Ranch Property Listings. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to find listings. "Search" finds listings by location with filters. "URL" fetches the exact listing or search URLs you paste (filters are ignored). |
locationsarray | Locations to search, e.g. "Texas", "Travis County, Texas", or "United States" for the national board. Each location is searched independently. |
propertyTypesarray | Keep only listings matching these property types (e.g. Recreational, Hunting, Undeveloped, Waterfront, Farms and Ranches, Timberland, Homesite, Commercial). Leave empty for all types. |
minPriceinteger | Only listings priced at or above this amount. |
maxPriceinteger | Only listings priced at or below this amount. |
minAcresinteger | Only listings with at least this many acres. |
maxAcresinteger | Only listings with at most this many acres. |
Show 16 more inputs
| Input | What it controls |
|---|---|
minBedsinteger | Only listings with at least this many bedrooms (applies to listings with a home). |
hasHouseboolean | Keep only listings that include a house / dwelling. |
urlsarray | Listing URLs (.../pid/123456789 or just .../pid/) or search URLs: state, county, national /land, property-type, acreage/price filter and page-N boards. Agent/broker profile URLs (/profile//) return that seller's active listings. Used only when Mode is "URL". Filter fields are ignored. |
fetchDetailsboolean | Open each listing page for the rich detail data (full description, amenities, price history, seller phone/email/company, video and virtual-tour links). Disable for a faster, lower-cost search run with the summary fields only. A pasted single-listing URL, and every listing returned from a pasted agent or broker profile URL, always opens its detail page and is always billed the detail-enrichment event, whatever this setting is. |
fetchSellerStatsboolean | Also open each listing seller's profile page once and add their listing statistics (active and past listing counts, price and acreage ranges) to the record's sellerDetails block. Needs "Fetch full listing details" on for searches. Adds one page load per distinct seller. |
maxItemsinteger | The cap on how many listings to return in total. This is the only limit applied by default (20). Set 0 for unlimited. |
maxPagesinteger | Optional safety stop on the number of result pages per location/search URL (25 listings per page). This does NOT cap your total results. Leave empty (or 0) for unlimited paging and let "Max listings" decide when to stop. Only set a value if you specifically want to limit paging depth. |
resumeFromRunIdstring | Optional: paste a previous run ID (or dataset ID) from this actor. Listings already collected there are skipped, so this run only returns new ones. Leave empty for a normal run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | For a search you run on a schedule: remembers what this exact search returned last time and labels every listing NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED in a changeType field, so you can act on only what changed. The first run returns everything as NEW. Later runs return only NEW, UPDATED and REAPPEARED unless you turn on the two toggles below. Off by default, so existing scheduled runs are unaffected. Separate from Resume above, which continues one specific interrupted run. Uses State key below to keep different searches apart. HOW MANY LISTINGS ONE BASELINE HOLDS: the saved state has a size limit. Measured on live Texas listings, about 1,000 tracked listings with Fetch full listing details on (8,545 compressed bytes per listing), and about 10,000 with it off (760 bytes per listing); listings with long descriptions and many photos use more. The run warns once the baseline passes 80% of that limit and refuses to save past it - after which the next run compares against the older baseline and reports the newer listings as NEW all over again, so you pay for them twice. Split a larger campaign into several scheduled runs, each with its own State key. |
stateKeystring | Names the saved baseline that Incremental mode compares against. Leave empty to derive one automatically from the mode, locations or URLs, all seven filters and the Fetch full listing details setting, so two differently configured searches never share a baseline. Set your own text only if you want to deliberately reuse or split baselines yourself. Ignored when Incremental mode is off. |
emitUnchangedboolean | Off by default. Turn on to also return listings that have not changed since the last run, labelled UNCHANGED. This returns, and bills, extra rows you already have (plus the detail enrichment surcharge on each of them when Fetch full listing details is on), so leave it off unless you want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return a synthetic row, labelled EXPIRED, for each listing that a previous run tracked and this run no longer finds. Only produced after a run that provably scanned the whole tracked search: if any location or URL could not be used, any page was refused or came back unreadable, or a cap, Resume or a restart cut the run short, expiry reporting is skipped for that run and the log says why, because a partial scan cannot tell "gone" apart from "not reached yet". It is skipped for the same reason when the search matches more listings than LandWatch will page through: the site stops offering further pages after about 20 pages (roughly 500 listings) per search, so a whole-state search reads only a slice of it and everything past that slice would otherwise be reported as gone. For expiry reporting, monitor a scope that fits inside that window, such as a single county or city. This returns, and bills, extra rows. EXPIRED rows count against Max listings like any other row; anything over the cap stays tracked and is reported on a later run. An EXPIRED row repeats the listing exactly as it was last seen, except otherListings and soldListings, which describe other properties and come back empty. |
ignoreFieldsForChangesarray | Incremental mode only. Field names that must NOT count as a change. A listing whose only differences are in these fields stays UNCHANGED (not billed) and they are left out of changedFields; the fields are still returned in the output. Use a plain name for a top-level field (for example images) or a dotted path for a nested one (for example propertyData.lastSale drops that key inside propertyData, in every element of a list). Saved baselines are re-compared with this list, so changing it never causes a one-time wave of UPDATED rows. |
mcpConnectorsarray | 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). |
notionParentPageUrlstring | Optional. Parent page ID/URL for a selected Notion connector. |
maxNotifyListingsinteger | Optional. Cap how many listings are pushed to the connectors. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
changeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (text)lastSeenAtLast seen (incremental mode) (text)idIDtitleTitleurlURL (link)pricePricepriceDisplayPrice (display)acresAcresacresDisplayAcres (display)pricePerAcre$/AcreShow 17 more fields
cityCitycountyCountystateStatestateAbbreviationSTzipZIPlatitudeLatlongitudeLngpropertyTypeTypebedsBedsbathsBathshasHouseHas houseimageCountImagesbrokerNameSellerbrokerCompanyCompanybrokerPhonePhonepropertyDataProperty data (object)brokerDetailsSeller details (object)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "26000001",
"lwPropertyId": "400000001",
"url": "https://www.landwatch.com/sample-county-texas-land-for-sale/pid/400000001",
"canonicalUrl": "/sample-county-texas-land-for-sale/pid/400000001",
"title": "40 Acre Hill Country Ranch",
"price": 750000,
"priceDisplay": "$750,000",
"pricePerAcre": 18750,
"acres": 40,
"acresDisplay": "40 Acres",
"beds": 3,
"baths": 2,
"hasHouse": true,
"city": "Sample City",
"county": "Sample County",
"state": "Texas",
"stateAbbreviation": "TX",
"zip": "78000",
"latitude": 30.2672,
"longitude": -97.7431,
"descriptionText": "Beautiful 40-acre ranch with rolling pasture, a stocked pond, and mature oaks...",
"Amenities": [
"Pond",
"Fenced",
"Well Water"
],
"imageCount": 18,
"images": [
"https://assets.landwatch.com/resizedimages/1600/1200/l/80/1-500000001"
],
"brokerName": "Jane Doe",
"brokerCompany": "Sample Land Co.",
"brokerPhone": "(000) 000-0000",
"agentProfile": {
"name": "Jane Doe",
"company": "Sample Land Co.",
"email": "agent@example.com",
"phone": "(000) 000-0000",
"licenseNumber": "0000000",
"listingCount": 12
},
"listingEvents": [
{
"date": "2026-01-01",
"eventTitle": "Price",
"newPrice": 750000,
"priceDelta": -5,
"acresDelta": null
}
],
"scrapedAt": "2026-01-01T00:00:00+00:00"
}Ways to use this data
- Land investors and hunting-property buyers: screen acreage, price-per-acre and amenities across states before contacting a seller.
- Real estate market researchers: track price history and price-per-acre trends across counties and property types.
- Lead generation and outreach teams: collect seller and broker contact details published on listings.
- Mapping and GIS projects: plot listings by latitude and longitude across a region.
- Portfolio monitoring: schedule incremental mode against one county or search to catch new, updated or delisted properties.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does LandWatch return?
The documented output for LandWatch includes change type (incremental mode), changed fields (incremental mode), first seen (incremental mode), last seen (incremental mode), id, title, url and price. Availability of each field depends on the source page and the selected mode.
How much does LandWatch cost?
It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new, changed or delisted listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated listings by default; turn on Emit expired listings to also get a tombstone row for listings that disappeared, subject to the completeness rules described in How to Use.
Why does "Fetch full listing details" not change a pasted listing URL?
A pasted single-listing URL (a .../pid/... or .../property/... address), and each listing returned from a pasted agent or broker profile URL (/profile//), always opens its own detail page and is always billed the detail-enrichment surcharge, no matter how the toggle is set. The toggle only decides whether search-mode rows, and rows from a pasted search URL, also open their detail page.
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.
