# LandWatch Scraper (`piotrv1001/landwatch-scraper`) Actor

The LandWatch Scraper extracts land for sale from LandWatch.com search and property pages, capturing price, acreage, price per acre, county, coordinates, listing history of price changes and land attributes like utilities and wells — ideal for land investors and rural real estate research.

- **URL**: https://apify.com/piotrv1001/landwatch-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 property listings

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/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

### 🚀 LandWatch Scraper — Land Listings, Acreage & Price History

Easily extract land for sale from LandWatch.com, the largest US marketplace for rural land, farms and ranches. The **LandWatch Scraper** turns any LandWatch search URL, or a list of property URLs, into structured property data: **price, acreage, price per acre, county, coordinates, full listing history and land attributes** such as utilities, wells, road frontage and proposed use.

### ✨ Features

- 🌾 **Complete Land Data**: Title, price, acres and hectares, price per acre, property types (farms and ranches, hunting land, timberland, lakefront…), address, city, ZIP, county, state, coordinates, beds, baths, home size, broker and photos.
- 📈 **Listing History**: Every event LandWatch publishes for a property: listed for sale, price changes (with the % change), acreage changes, auctions and sales, each with its date. The latest price change is also summarized as `priceChangeUsd`, `priceChangePercent` and `priceChangedAt`.
- 🧭 **Land Attributes**: Structured categories such as Street/Utilities, Proposed Use, Lot Description, Road Frontage, Easements and Activities, kept exactly as the listing states them, with duplicates removed.
- 🏷️ **Honest Prices**: "Call for price" and auction listings get `priceUsd: null` and a `priceType` of `contactForPrice` or `auction`, never a fake $1 or $2 price. Auctions include their dates, time zone and title.
- 🔗 **Refresh Known Properties**: Paste property URLs (`…/pid/425766087`) to re-check the price, status and history of properties you already track.
- 🔍 **Any Search Works**: Set filters on landwatch.com (state, county, city, property type, acreage, price) and paste the URL.
- 🧮 **No Duplicates**: A property found by several searches is saved and charged once.

### 🛠️ How It Works

1. **Find your land on LandWatch**: Open a search on landwatch.com, apply any filters and copy the URL. Or collect property page URLs.
2. **Choose the depth**: Keep it fast with search results only, or turn on **Scrape full property details** to add listing history, land attributes, county FIPS, the description and all photos.
3. **Run the Scraper**: Download the properties as JSON, CSV or Excel, or pull them through the API.

### ⚙️ Input

| Field                            | Description                                                                                                                                                                                   |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **LandWatch URLs**               | Search pages such as `https://www.landwatch.com/texas-land-for-sale` or `…/texas-land-for-sale/harris-county/acres-under-10`, and property pages. Property pages always include full details. |
| **Scrape full property details** | Adds listing history, land attributes, county FIPS, description, highlights, all photos and auction details.                                                                                  |
| **Max results**                  | Maximum number of properties to save (default 50).                                                                                                                                            |

### 💰 Pricing

Pay only for the properties you get, with no monthly fee and no extra platform usage costs:

| Event                                                                                    | Price    | Per 1,000 |
| ---------------------------------------------------------------------------------------- | -------- | --------- |
| **Actor start**: once per run, per GB of memory                                          | $0.00005 | –         |
| **Property listing**: a property saved from search results                               | $0.001   | $1.00     |
| **Property detail**: a property saved with full details (charged instead of the listing) | $0.0015  | $1.50     |

Properties that are no longer listed are not charged. If full details can't be loaded for a property, it is saved and charged as a plain listing, and `detailStatus` says why.

### 📊 Sample Output Data

One property with **Scrape full property details** enabled (text and photos shortened):

```json
[
    {
        "siteListingId": 427783557,
        "listingId": 28381042,
        "url": "https://www.landwatch.com/edwards-county-texas-farms-and-ranches-for-sale/pid/427783557",
        "title": "#135 Superior Views, Better Hunting",
        "priceUsd": 779950,
        "priceType": "fixed",
        "acres": 108.1,
        "hectares": 43.7465,
        "pricePerAcreUsd": 7215.08,
        "propertyTypes": ["Farms and Ranches", "Hunting Property", "House"],
        "marketStatusCode": 1,
        "address": "7997 SD 5200",
        "city": "Rocksprings",
        "zip": "78880",
        "county": "Edwards County",
        "countyFips": "48137",
        "state": "Texas",
        "stateCode": "TX",
        "region": "Edwards Plateau West Texas",
        "latitude": 29.844100952148438,
        "longitude": -100.3208999633789,
        "beds": 3,
        "baths": 1,
        "halfBaths": null,
        "homeSqft": 934,
        "priceChangeUsd": -35050,
        "priceChangePercent": -4.3,
        "priceChangedAt": "2026-08-11",
        "listedAt": "2026-08-07",
        "lastUpdatedAt": "2026-09-03T14:29",
        "auctionStartAt": null,
        "auctionEndAt": null,
        "brokerName": "Glynn Hendley",
        "brokerCompany": "Western Hill Country Realty",
        "imageCount": 62,
        "mainImageUrl": "https://assets.landwatch.com/resizedimages/10000/0/h/80/1-6406409998",
        "auctionTitle": null,
        "auctionTimezone": null,
        "auctionInfoUrl": null,
        "summary": "This turnkey hunting ranch offers breathtaking Hill Country views, diverse terrain, quality improvements, and exceptional wildlife habitat.…",
        "highlights": [
            "Spectacular Hill Country views with live oak flats and rugged Indian Creek Arroyo",
            "Turnkey improvements including furnished home, guest cabin, well, and septic system"
        ],
        "description": "+/-108.1 Acres Superior Views, Better Hunting \nLocated in south central Edwards County\nStunning variety of terrain, from hill country hilltop views to the deep…",
        "isIrrigated": false,
        "hasResidence": true,
        "parcelReferenceRaw": "0|2595|80114|1",
        "mlsId": null,
        "landAttributes": [
            {
                "group": "Land",
                "category": "Activities",
                "values": ["Hunting", "Off-roading"]
            },
            {
                "group": "Land",
                "category": "Lot Description",
                "values": ["Acreage", "Heavily Treed", "Horses Permitted", "Pasture"]
            },
            {
                "group": "Land",
                "category": "Proposed Use",
                "values": [
                    "Agriculture",
                    "Exotics",
                    "Grazing",
                    "Hobby Farm",
                    "Homestead",
                    "Hunting/Fishing",
                    "Residential Single"
                ]
            },
            {
                "group": "Land",
                "category": "Street/Utilities",
                "values": ["Outside City Limits", "Overhead Utilities", "Septic", "Well"]
            }
        ],
        "listingHistory": [
            {
                "date": "2026-08-11",
                "event": "Price",
                "priceUsd": 779950,
                "priceChangePercent": -4.3,
                "acres": 108.1,
                "acresChange": 0
            },
            {
                "date": "2026-08-07",
                "event": "Listed for Sale",
                "priceUsd": 815000,
                "priceChangePercent": null,
                "acres": 108.1,
                "acresChange": null
            }
        ],
        "imageUrls": [
            "https://assets.landwatch.com/resizedimages/10000/0/h/80/1-6406409998",
            "https://assets.landwatch.com/resizedimages/10000/0/h/80/1-6406409974"
        ],
        "videoUrl": "https://youtu.be/-Qxps3tfcys",
        "brokerProfileUrl": "https://www.landwatch.com/profile/glynn-hendley/4657",
        "externalListingUrl": "https://www.westernhillcountryrealty.com/properties/superior-views%2C-better-hunting",
        "detailStatus": "ok",
        "scrapedAt": "2026-09-23T07:33:50.985Z"
    }
]
```

### ❓ FAQ

**Is `parcelReferenceRaw` the parcel number (APN)?** No. It is LandWatch's internal parcel reference, provided as-is. It is not a county assessor parcel number. Check the county records for the official APN.

**Are the land attributes zoning or water rights?** No. They are the categories the seller chose on LandWatch, e.g. "Well" or "Proposed Use: Hobby Farm". A missing category means the seller didn't fill it in, not that the property lacks it. Property types such as "Farms and Ranches" are not zoning codes either.

**Is the listing history tracked by the scraper?** It is the history LandWatch publishes on the property page. To follow changes over time, schedule the scraper with your property URLs and compare runs by `siteListingId`.

**Why did my search stop at 500 properties?** LandWatch shows at most 20 pages (500 properties) per search. Split large searches by county, acreage or price range, e.g. `…/texas-land-for-sale/price-under-49999`. Properties found in more than one search are saved only once.

**What is `marketStatusCode`?** The status code LandWatch uses for the listing. `1` means the property is currently for sale. A "Sold" event in the history refers to a past sale and does not mean the current listing is sold.

Find your next acreage faster with the **LandWatch Scraper**. 🚀

# Actor input Schema

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

LandWatch search pages, e.g. `https://www.landwatch.com/texas-land-for-sale` or a filtered one like `https://www.landwatch.com/texas-land-for-sale/harris-county/acres-under-10` — set the filters on landwatch.com and paste the URL. Property pages (`…/pid/425766087`) are also accepted and always include full details.

## `scrapeDetails` (type: `boolean`):

Open every property and add its listing history (listed, price and acreage changes, sold), land attributes (road frontage, utilities, wells, proposed use, activities…), county FIPS, description, highlights, all photos and auction details. Charged as a property detail instead of a property listing.

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

Maximum number of properties to save. A single search shows at most 500 properties.

## `proxyConfiguration` (type: `object`):

Proxy used to reach landwatch.com. The default works for most runs.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.landwatch.com/texas-land-for-sale"
  ],
  "scrapeDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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 = {
    "startUrls": [
        "https://www.landwatch.com/texas-land-for-sale"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/landwatch-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.landwatch.com/texas-land-for-sale"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/landwatch-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 '{
  "startUrls": [
    "https://www.landwatch.com/texas-land-for-sale"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piotrv1001/landwatch-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/landwatch-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/qjrOEhQGO3bkVxTxL/builds/hfwxjRg8CFge4eTBc/openapi.json
