LandWatch $1๐ฐ Land, Farm & Ranch Property Listings
Pricing
from $1.00 / 1,000 listing results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
LandWatch Scraper
Extract land, farm, ranch, and rural property listings from landwatch.com at scale. Search by location with price and acreage filters, or paste listing and search URLs, and get a clean structured record for every property: price, acreage, price-per-acre, coordinates, full description, amenities, price history, photo URLs, plus seller name, phone, email, and company. 90+ fields per listing and low cost on every plan.
Why This Scraper?
- 90+ fields per listing including the full property description, every amenity, complete price history, and all photo URLs, not just a summary card.
- Seller contact details on each listing: name, phone, email, license number, and company, when published by the listing.
- Two ways to collect listings: search by location with filters, or paste exact listing/search URLs.
- Powerful filters for price range, acreage range, bedrooms, property type, and whether a home is included.
- Geo coordinates (latitude/longitude) on every listing for mapping and analysis.
- Low cost on the default connection settings, returning 25 listings per result page.
- Resilient by design with a configurable traffic budget and automatic recovery on connection errors.
Data You Get
Each listing is one dataset record. The table below shows a representative subset (the full record carries 90+ fields).
| Field | Example |
|---|---|
id | 26000000 |
title | 40 Acre Hill Country Ranch |
url | https://www.landwatch.com/sample-county-texas-land-for-sale/pid/400000000 |
price | 750000 |
priceDisplay | $750,000 |
acres | 40 |
acresDisplay | 40 Acres |
pricePerAcre | 18750 |
city | Sample City |
county | Sample County |
state | Texas |
stateAbbreviation | TX |
zip | 78000 |
latitude | 30.2672 |
longitude | -97.7431 |
propertyTypesLabel | Farms and Ranches, House |
beds | 3 |
baths | 2 |
hasHouse | true |
descriptionText | Beautiful 40-acre ranch with rolling pasture, a stocked pond... |
Amenities | ["Pond", "Fenced", "Well Water"] |
imageCount | 42 |
images | ["https://assets.landwatch.com/.../1-600000000", ...] |
brokerName | Jane Doe |
brokerCompany | Sample Land Co. |
brokerPhone | (000) 000-0000 |
listingEvents | [{"date": "2026-01-01", "eventTitle": "Price", "newPrice": 750000}] |
How to Use
1. Search a state for land, summary fields only (fastest):
{"mode": "search","locations": ["Texas"],"fetchDetails": false,"maxItems": 100}
2. 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}
3. 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/400000000"],"fetchDetails": true}
Input Parameters
| Parameter | Type | Description |
|---|---|---|
mode | string | search (location + filters) or url (paste URLs). |
locations | array | Locations to search, e.g. "Texas", "Travis County, Texas", or "United States". Search mode only. |
propertyTypes | array | Keep only matching types (Recreational, Hunting, Undeveloped, Waterfront, Farms and Ranches, Timberland, Homesite, Commercial). |
minPrice / maxPrice | integer | Price range in USD. |
minAcres / maxAcres | integer | Acreage range. |
minBeds | integer | Minimum bedrooms (listings with a home). |
hasHouse | boolean | Keep only listings that include a house. |
urls | array | Listing or search URLs. URL mode only. |
fetchDetails | boolean | Open each listing page for full detail (default true). |
maxItems | integer | The cap on listings returned in total (default 20; 0 = unlimited). This is the only default limit. |
maxPages | integer | Optional bound on result pages walked per search. Leave empty (or 0) to walk every result page; maxItems decides when to stop. |
resumeFromRunId | string | Optional: a previous run ID (or dataset ID) from this actor. Listings already collected there are skipped, so the run returns only new ones. Continues ONE interrupted run; for recurring monitoring use incrementalMode. |
incrementalMode | boolean | Recurring monitoring of the same search. Default false. See below. |
stateKey | string | Optional name for the saved baseline. Auto-derived from the mode, locations/URLs and every filter when left empty. |
emitUnchanged | boolean | Also return (and bill) rows that did not change. Default false. |
emitExpired | boolean | Also return (and bill) a synthetic row for listings that disappeared. Default false. |
proxy | object | Connection settings. Default works on every plan. |
maxResidentialMB | integer | Optional traffic budget when using a residential group (0 = unlimited). |
Recurring Monitoring (incremental mode)
Turn on incrementalMode when you schedule this actor against the same search
repeatedly and only want what changed. The actor remembers what that search
returned last time and adds four columns to every row:
| Column | Meaning |
|---|---|
changeType | NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. |
changedFields | For UPDATED, the field names that actually moved. |
firstSeenAt | When this actor first saw the listing on this search. |
lastSeenAt | The most recent run that saw it. |
The first run returns everything as NEW. Later runs return only NEW,
UPDATED and REAPPEARED, so you are not billed again for listings you
already have. emitUnchanged and emitExpired add the other two categories
back; both are off by default because both return, and bill, extra rows.
Two behaviours worth knowing before you schedule it:
- Different filters never share a baseline. The saved state is keyed on the
mode, the locations or URLs, all seven filters and the
fetchDetailssetting, so two differently configured searches cannot overwrite each other. SetstateKeyyourself only if you want to override that. EXPIREDis only reported after a provably complete run. If a page was refused or came back unreadable, if a listing page could not be read, if a location or URL could not be used, or ifmaxItems/maxPages/Resumecut the run short, expiry reporting is skipped for that run and the log says why. A partial scan cannot tell "gone" apart from "not reached yet", and wrongly marking a live listing as gone would cost you a row now and another one when it comes back.- LandWatch itself stops paging after about 20 pages (~500 listings) per
search, whatever the search matches:
texas-land-for-salereports 80,405 matching listings and hands over 500 of them. That is the site's limit, not this actor's, and no input can raise it. The run logs how many the site says it matched, andEXPIREDreporting is skipped for any search bigger than what the site would page through, because otherwise every listing past page 20 would be reported as gone and billed. For expiry reporting, monitor scopes that fit inside that window: single counties or cities, or a state split by filters, rather than a whole state in one search. - How many listings one baseline can track. The saved state has a size
limit, and the count that fits depends on
fetchDetails. Measured on live Texas listings (2026-09-06) from the state this actor actually saved: about 1,000 tracked listings withfetchDetails: true(8,545 compressed bytes per listing, measured over 50) and about 10,000 withfetchDetails: false(760 bytes per listing, measured over 500). Listings with long descriptions and many photos use more. The run warns once the baseline passes 80% of the limit, and refuses to save past it, at which point the next run starts from the older baseline and re-reports the newer listings asNEW, so you pay for them twice. Split a bigger campaign into several scheduled runs, each with its ownstateKey. EXPIREDrows carry anullotherListings/soldListings. Those two fields describe other properties near the listing, so they are not kept in the baseline; every other field of the expired listing comes back exactly as it was last seen.
resumeFromRunId and incrementalMode are different features and the actor
stops with an explanation if you combine them against a search that already has
saved state.
Output Example
Sample shape - values are illustrative placeholders, not from a live listing.
{"id": "26000000","lwPropertyId": "400000000","url": "https://www.landwatch.com/sample-county-texas-land-for-sale/pid/400000000","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,"propertyTypesLabel": "Farms and Ranches, House","descriptionText": "Beautiful 40-acre ranch with rolling pasture, a stocked pond, and mature oaks...","Amenities": ["Pond", "Fenced", "Well Water"],"imageCount": 42,"images": ["https://assets.landwatch.com/resizedimages/1600/1200/l/80/1-600000000"],"brokerName": "Jane Doe","brokerCompany": "Sample Land Co.","brokerPhone": "(000) 000-0000","brokerDetails": {"contactName": "Jane Doe","companyName": "Sample Land Co.","email": "agent@example.com","licenseNumber": "0000000","phoneOffice": "(000) 000-0000"},"listingEvents": [{ "date": "2026-01-01", "eventTitle": "Price", "newPrice": 750000, "priceDelta": -5.0 }],"scrapedAt": "2026-01-01T00:00:00+00:00"}
Export to Your Apps (optional)
Set mcpConnectors to one or more Apify MCP connector IDs to push results straight into tools like Notion (provide notionParentPageUrl). Leave it empty to skip; the dataset is unaffected.
Plan Requirement
This scraper runs on every Apify plan, including the free tier, using the default connection settings. For large jobs or if you see connection errors, enable Apify Proxy or switch to a residential group in the Connection section.