LandWatch $1πŸ’° Land, Farm & Ranch Property Listings avatar

LandWatch $1πŸ’° Land, Farm & Ranch Property Listings

Pricing

from $1.00 / 1,000 listing results

Go to Apify Store
LandWatch $1πŸ’° Land, Farm & Ranch Property Listings

LandWatch $1πŸ’° Land, Farm & Ranch Property Listings

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.

Pricing

from $1.00 / 1,000 listing results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

4 days ago

Last modified

Share

LandWatch Scraper: Land, Farm & Ranch Listings

LandWatch Scraper turns landwatch.com into structured property data. Search by location with price, acreage, bedroom and property-type filters, or paste exact listing and search URLs, and get a clean record for every property: price, price-per-acre, acreage, coordinates, full description, amenities, price history, photo URLs, and seller name, phone, email, license number and company when the listing publishes them. Export to JSON, CSV or Excel, or pull results straight into your app through the API.

Why This Scraper?

  • 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.
  • A refused run fails loudly with a clear message instead of silently completing with an empty dataset.

Use Cases

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

Data You Get

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

FieldExample
id26000001
lwPropertyId400000001
urlhttps://www.landwatch.com/sample-county-texas-land-for-sale/pid/400000001
title"40 Acre Hill Country Ranch"
price / priceDisplay750000 / "$750,000"
pricePerAcre18750
acres / acresDisplay40 / "40 Acres"
beds / baths3 / 2
hasHousetrue
city / county"Sample City" / "Sample County"
state / stateAbbreviation"Texas" / "TX"
zip"78000"
latitude / longitude30.2672 / -97.7431
descriptionText"Beautiful 40-acre ranch with rolling pasture, a stocked pond..."
Amenities["Pond", "Fenced", "Well Water"]
imageCount / images18 / ["https://assets.landwatch.com/.../1-500000001", ...]
brokerName / brokerCompany"Jane Doe" / "Sample Land Co."
brokerPhone"(000) 000-0000"
listingEvents[{"date": "2026-01-01", "eventTitle": "Price", "newPrice": 750000, "priceDelta": -5.0}]
scrapedAt"2026-01-01T00:00:00+00:00"

priceDisplay, pricePerAcre, acresDisplay and the other display-style fields are read off the search-result card, so they are populated when the search card carries them on a search-mode row or a pasted search URL, but come back null on a pasted single-listing URL, which never has a search card behind it. descriptionText, Amenities, listingEvents and the broker fields are read off the listing's own detail page, so they are populated whenever that page was fetched, which happens for every URL-mode listing URL and for every search row when Fetch full listing details is on. The full record also carries the raw propertyData, brokerDetails, propertyAmenities and propertyMediaData namespaces verbatim, a compact agentProfile object (name, company, email, phone, license number), video and virtual-tour links, price-change and sale history, an MLS id, listing-tier flags (isDiamond, isGold, isPlatinum, isShowcase), nearby broker or county inventory (otherListings, soldListings, always null on an EXPIRED row) and a set of competitor-style duplicate keys (Type, Size, Address, Seller Name, Seller Telephone, and similar) folded in for compatibility. Incremental mode adds changeType, changedFields, firstSeenAt and lastSeenAt to every row; see below.

How to Use

  1. Pick a mode: search (location plus filters) or url (paste listing or search links).
  2. In search mode, set Locations and optionally narrow with the price, acreage, bedroom, property-type and house filters.
  3. Turn Fetch full listing details on for the full record (description, amenities, price history, seller contact) or off for a faster, lower-cost summary-only run.
  4. Set Max listings to control run size and cost, then click Start.

Search a state, summary fields only (fastest):

{
"mode": "search",
"locations": ["Texas"],
"fetchDetails": false,
"maxItems": 100
}

Search with filters and full detail (description, amenities, seller contact):

{
"mode": "search",
"locations": ["Texas", "Florida"],
"minPrice": 250000,
"maxPrice": 1000000,
"minAcres": 10,
"fetchDetails": true,
"maxItems": 200
}

Paste specific listing or search URLs (filters ignored):

{
"mode": "url",
"urls": [
"https://www.landwatch.com/texas-land-for-sale",
"https://www.landwatch.com/sample-county-texas-land-for-sale/pid/400000001"
],
"fetchDetails": true
}

Monitor one county on a schedule, reporting listings that disappeared too:

{
"mode": "search",
"locations": ["Travis County, Texas"],
"incrementalMode": true,
"emitExpired": true,
"maxItems": 0
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/landwatch-scraper").call(run_input={"mode": "search", "locations": ["Texas"], "maxItems": 50})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing["title"], listing["price"], listing["acres"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/landwatch-scraper').call({ mode: 'search', locations: ['Texas'], 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.

Max listings, Max pages, and the site's own paging limit

Max listings (maxItems, default 20, 0 = unlimited) is the only cap applied by default. Max pages (maxPages) is an optional extra stop on how many result pages one location or search URL walks (25 listings per page); leave it empty or 0 to let Max listings decide when to stop. Independently of both settings, landwatch.com itself stops offering further result pages after about 20 pages (roughly 500 listings) per search, whatever the search actually matches: a broad search such as an entire state can report tens of thousands of matching listings and hand over only that first slice. That is the site's own limit, not this actor's, and no input can raise it. The run logs how many listings the site says a search matched so you can see when a search was clamped this way; split a broad search into counties or cities, or add filters, to read past it.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips every listing already collected there, so you are not billed twice for it.
  • Incremental mode (incrementalMode) is for scheduling the same search repeatedly. Each row gets a changeType of NEW, UPDATED (with changedFields), UNCHANGED (suppressed, and not billed, unless emitUnchanged is on) or EXPIRED (a synthetic row for a listing the baseline had and this run no longer finds; billed, and only produced when emitExpired is on). A listing that was previously marked EXPIRED and is seen again is reported once as REAPPEARED; that label can only occur for a listing this actor had already tombstoned as gone, so it never appears on a first run and never appears unless emitExpired was on for the run that tombstoned it.
  • EXPIRED is reported only after a run that proves it scanned the whole tracked search. If any location or URL could not be resolved, any page was refused or came back unreadable, a cap or Resume cut the run short, or the search matches more listings than landwatch.com will page through (the ~20-page limit above), expiry detection is skipped for that run and the log says why. A partial scan cannot tell "gone" apart from "not reached yet", and a live listing wrongly marked gone would bill once for the tombstone and again as REAPPEARED when it resurfaces.
  • Different filters never share a baseline. The saved state is keyed on the mode, the locations or URLs, every filter and the Fetch full listing details setting. Set stateKey yourself only to deliberately reuse or split a baseline.
  • One baseline has a size limit. Measured on live Texas listings: roughly 1,000 tracked listings with Fetch full listing details on, and roughly 10,000 with it off. The run warns as the baseline approaches the limit and refuses to save past it; past that point the next run compares against the older baseline and reports the newer listings as NEW again. Split a large monitoring campaign into several scheduled runs, each with its own stateKey.

resumeFromRunId and incrementalMode are different features; combining them against a search that already has saved incremental state stops the run with an explanation.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results 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 items 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

ParameterTypeDefaultDescription
modestringsearchsearch (location plus filters) or url (paste URLs).
locationsarray["Texas"]Locations to search, e.g. "Texas", "Travis County, Texas", or "United States" for the national board. Search mode only.
propertyTypesarray[]Keep only listings matching these types (Recreational, Hunting, Undeveloped, Waterfront, Farms and Ranches, Timberland, Homesite, Commercial). Empty means all types.
minPriceintegerno defaultOnly listings priced at or above this amount (USD).
maxPriceintegerno defaultOnly listings priced at or below this amount (USD).
minAcresintegerno defaultOnly listings with at least this many acres.
maxAcresintegerno defaultOnly listings with at most this many acres.
minBedsintegerno defaultOnly listings with at least this many bedrooms (applies to listings with a home).
hasHousebooleanfalseKeep only listings that include a house or dwelling.
urlsarray[]Listing URLs (.../pid/123456789) or search URLs (.../texas-land-for-sale). URL mode only; the input console prefills a sample search URL for guidance, but the schema default is an empty list.
fetchDetailsbooleantrueOpen each listing's own page for the full record (description, amenities, price history, seller contact, video and virtual-tour links). A pasted single-listing URL always fetches, and is always billed, its full detail regardless of this setting; it only changes what a search (or a pasted search URL) returns.
maxItemsinteger20Cap on listings returned in total. This is the only limit applied by default. 0 means unlimited.
maxPagesintegerno default (0/empty = unlimited)Optional extra stop on result pages walked per location or search URL (25 listings per page). Does not cap total results; Max listings decides when to stop.
resumeFromRunIdstringno defaultOptional: a previous run ID or dataset ID from this actor. Listings already collected there are skipped, so this run returns only new ones. For recurring monitoring of the same search, use Incremental mode instead.
incrementalModebooleanfalseRecurring monitoring of the same search: labels every listing with a changeType. See the How to Use section.
stateKeystringno defaultOptional name for the saved incremental-mode baseline. Auto-derived from the mode, locations or URLs, every filter and Fetch full listing details when left empty.
emitUnchangedbooleanfalseAlso return, and bill, listings that did not change since the last incremental run.
emitExpiredbooleanfalseAlso return, and bill, a synthetic row for a tracked listing this run no longer finds. Only produced after a provably complete scan.
proxyobject{"useApifyProxy": true}Connection settings.
maxResidentialMBinteger0Optional traffic budget when using a residential proxy group; after the cap the run auto-downgrades to the Datacenter group. 0 means unlimited.
mcpConnectorsarrayno default (none selected)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstringno defaultNotion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

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

{
"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.0, "acresDelta": null }
],
"scrapedAt": "2026-01-01T00:00:00+00:00"
}

Plan Requirement

The default connection setting works out of the box and returns 25 listings per result page. The actor rotates its connection automatically on repeated failures, and downgrades a residential connection to the standard tier once its traffic budget is spent. For large or frequent runs, or if you see connection errors, switch to the residential proxy group in the Connection section. The Pricing tab shows current rates for this actor.

FAQ

How much does it cost?

You pay per run start, per listing returned, and a smaller surcharge for each listing whose full detail page was fetched (on by default; the toggle is Fetch full listing details). The Pricing tab shows the current rates. Use Max listings to cap the cost of any run.

This actor collects only publicly available property listing data. You are responsible for how you use it: follow LandWatch's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution, particularly around published seller and broker contact details.

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

Why did my run fail instead of returning an empty dataset?

If the actor's own HTTP client could not start, if LandWatch answered normally but the page no longer contained readable listing data, or if not one request got through at all, the run fails with a specific message naming which of those happened, rather than completing with zero rows. A run that genuinely found nothing (the site answered, the search matches nothing) still completes normally with a status message. Retrying a failed run, or switching the proxy group, helps only for the connection case; the run log says which case applies.

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:

πŸš— Dubizzle.com Scraper
From $1/1K. Scrape dubizzle.com across the UAE for property, motors, and agent listings...
🏠 Crexi Scraper
Scrape crexi.com commercial listings: asking price, cap rate, square footage, units, year...
🏠 Zumper
Scrape Zumper.com rental listings: apartments, houses, condos and rooms. Pulls 60+ fields...
🏠 CommercialGuru SG Property Listings & Agent Contacts Scraper
Scrape commercialguru.com.sg Singapore listings at scale. Extract prices, PSF, floor...
🏠 Zonaprop Argentina
Scrape Zonaprop.com.ar property listings across Argentina. Extract 140+ fields including...
🏠 Lennar Homes, Communities & Floor Plans Scraper
Scrape Lennar new-home communities, move-in-ready homes and floor plans. Extract prices...

πŸ‘‰ Browse all abotapi scrapers

πŸ’¬ Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • πŸ› οΈ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.