# LandWatch Scraper - Land, Farm & Ranch Listings (`sian.agency/landwatch-property-scraper`) Actor

Scrape LandWatch land listings: acreage, price per acre, mineral, water and wind rights, road frontage, GPS, price history and broker contacts. Clean JSON and CSV.

- **URL**: https://apify.com/sian.agency/landwatch-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.97 / 1,000 property searches

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LandWatch Scraper — Land, Farm & Ranch Listings to JSON 🚀

[![Store SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store Zillow Property](https://img.shields.io/badge/Store-Zillow%20Property-1F4E79)](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian) [![Store Redfin Property](https://img.shields.io/badge/Store-Redfin%20Property-A02021)](https://apify.com/sian.agency/redfin-property-scraper?fpr=sian) [![Store Homes.com Property](https://img.shields.io/badge/Store-Homes.com%20Property-1AE392)](https://apify.com/sian.agency/homes-com-property-scraper?fpr=sian)

#### 🎉 Acreage, price per acre and mineral rights — as columns, not buried in a description

##### Built for land investors, appraisers, brokers and anyone who values rural property by the acre

***

### 🔎 What is the LandWatch Scraper — and when should you use it?

The **LandWatch Scraper** turns public LandWatch listings for land, farms, ranches and hunting property across all 50 US states into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** acreage, price per acre and asking price as sortable numbers, plus GPS coordinates, county and FIPS code, land type and market status. The land columns come with them — mineral, water and wind rights percentages, road frontage, topography, game species, utilities, present and proposed use. Every row also carries the listing agent's name, brokerage and phone, and switching on full details adds the seller's write-up and the complete price history.

**Use something else when:** you are pricing houses in a city rather than land by the acre. Use [Zillow Property Scraper](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian) for residential homes, where bedrooms and square footage matter more than parcel size. Use [LoopNet Property Scraper](https://apify.com/sian.agency/loopnet-property-scraper?fpr=sian) for commercial and industrial property, where the buyer underwrites a building rather than acreage. Use [Auction.com Property Scraper](https://apify.com/sian.agency/auction-com-property-scraper?fpr=sian) for foreclosure and bank-owned property sold at auction rather than listed by a broker. This actor reads LandWatch and covers the United States only. The rights, topography and game-species columns are the seller's own declarations, not a title search.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/landwatch-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want to find rural land, farms and ranches worth buying, priced by the acre using the Apify Actor `sian.agency/landwatch-property-scraper`.

Use it when I need: acreage, price per acre and asking price as sortable numbers, plus GPS coordinates, county and FIPS code, land type and market status. The land columns come with them — mineral, water and wind rights percentages, road frontage, topography, game species, utilities, present and proposed use. Every row also carries the listing agent's name, brokerage and phone, and switching on full details adds the seller's write-up and the complete price history.

Don't use it when: you are pricing houses in a city rather than land by the acre — use zillow-property-scraper or loopnet-property-scraper or auction-com-property-scraper instead.

How to call it: set `operation` to `search` and give `locations` a list of states, counties or cities — "Montana", "Harris County, TX", "Fredericksburg, TX". Narrow with `propertyType`, `availability` (use `sold` for comparables), `minAcres` and `maxAcres`, `minPrice` and `maxPrice`, `activity`, `mineralRights` or `ownerFinancing`. `includeDetails` adds rights, topography, game species and price history to every row for an extra charge per property. To expand properties you already have, set `operation` to `detail` and pass `propertyUrls`; to reuse a search you built on the site, paste it into `searchUrls`.

Start with this input:
{
  "operation": "search",
  "locations": [
    "Montana"
  ],
  "propertyType": "farms-ranches",
  "minAcres": 51,
  "maxResults": 100,
  "includeDetails": true
}

Ask me which states or counties to cover, how many properties they want, and whether they need the rights and price-history columns, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every ranch over 500 acres in Montana and Wyoming, then rank them by price per acre.*
- *Find Texas land where the seller conveys mineral rights and tell me what percentage of oil and gas is included.*
- *Get the sold comparables for Parker County, Texas and work out the median price per acre.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/landwatch-property-scraper.md](https://apify.com/sian.agency/landwatch-property-scraper.md).

### 📋 Overview

**Rural property is priced by the acre, and almost no property feed treats it that way.** This actor reads LandWatch — the largest US marketplace for land, farms, ranches and hunting property — and returns every listing as a typed row, for buyers and analysts who care about parcel size, water and what the seller actually conveys.

**Why land professionals choose us:**

- ✅ **Price per acre on every row**: acreage, asking price and the resulting per-acre figure arrive as numbers you can sort, not text you have to parse
- ⛏️ **Rights as real columns**: percentage of oil and gas, water and wind ownership, plus surface rights, pulled out of the seller's declarations into typed fields
- 🗺️ **The land attributes buyers filter on**: road frontage, topography, game species, utilities, ponds and wells, present and proposed use
- ⚡ **A whole state, not its first 500 rows**: LandWatch caps any single search at 500 results — this actor detects that ceiling and keeps going by splitting on the site's own county, city, price and acreage filters
- 💰 **From $0.86 per 1,000 properties**: among the lowest prices on the Store for this source, and you are never charged for a failed row
- 📈 **Price history included**: every cut, rise and relisting with its date and percentage, so a stale listing is obvious
- 💎 **Sold comparables**: six figures of closed listings per state, in the same row shape as live ones
- 🧑‍💼 **Broker contacts on every row**: agent name, brokerage, phone and profile link, at no extra cost
- ✨ **NEW**: county FIPS codes on enriched rows, so results join straight onto USDA, census and soil datasets

***

### ✨ Features

- 🔍 **Search by state, county or city**: give it "Montana" or "Harris County, TX" and it resolves the location against LandWatch's own list
- 🏞️ **Thirteen land types**: undeveloped, homesites, homes, farms and ranches, recreational, hunting, timberland, waterfront, lakefront, riverfront, beachfront, horse and commercial
- 📌 **Four market statuses**: available, under contract, sold and off market — the sold archive is your comparables set
- 📐 **Acreage and price filters**: bound a search by parcel size and asking price to isolate the slice you are actually buying in
- ⛏️ **Mineral-rights and owner-financing filters**: two switches that narrow a state to the listings with unusual terms
- 🎯 **Activity filters**: hunting, fishing, horseback riding, camping, boating, off-roading, RVing, golfing and beach
- 📄 **Optional full detail**: one switch adds the seller's write-up, highlights, rights, topography, price history and attached plats to every row
- ♻️ **Duplicates never billed**: a property that appears in two overlapping searches is delivered once and charged once
- 🔗 **Paste-a-URL mode**: hand it any LandWatch search URL and every filter already in it carries through
- 📊 **80 typed fields**: exported as JSON, CSV or Excel straight from the dataset

***

### 🎬 Quick Start

Pick a location, choose how many properties you want, and press Start. The default run pulls 100 available Texas listings, so you can see the shape of the data before changing anything. Swap in your own state or county once you know what you are looking at.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~landwatch-property-scraper/runs?token=YOUR_TOKEN \
-d '{"operation": "search", "locations": ["Montana"], "maxResults": 100}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Name your ground

Type one or more locations into **Locations** — a state like "Montana", a county like "Harris County, TX", or a city like "Fredericksburg, TX".

#### Step 2: Narrow it

Set the property type, acreage band, price range or any of the other filters. Leave them alone to take everything the location has.

#### Step 3: Press Start

Results land in the dataset as they arrive. Export to CSV or Excel, or pull them over the API.

**That's it! In under a minute, you'll have:**

- Every matching parcel with its acreage and price per acre
- GPS coordinates ready to drop onto a map
- The listing agent's name, brokerage and phone for each one

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| operation | string | No | `search` for listings, `detail` to expand known properties |
| locations | array | No | States, counties or cities — "Montana", "Harris County, TX" |
| propertyType | string | No | One of thirteen land types, or `any` |
| availability | string | No | `available`, `under-contract`, `sold`, `off-market` or `any` |
| minPrice / maxPrice | integer | No | Asking-price bounds in USD; 0 means unbounded |
| minAcres / maxAcres | integer | No | Parcel-size bounds in acres; 0 means unbounded |
| minBeds | integer | No | Minimum bedrooms when the parcel has a residence |
| hasResidence | string | No | `yes` for land with a house, `no` for bare land, `any` for both |
| mineralRights | boolean | No | Only listings that convey mineral rights |
| ownerFinancing | boolean | No | Only listings the seller will finance |
| activity | string | No | Hunting, fishing, camping and six more |
| maxResults | integer | No | Stop after this many properties (default 100) |
| includeDetails | boolean | No | Add rights, topography, price history and the full write-up |
| propertyUrls | array | No | LandWatch property URLs for the `detail` operation |
| searchUrls | array | No | Paste LandWatch search URLs instead of using the fields above |

**Example:**

```json
{
  "operation": "search",
  "locations": ["Montana"],
  "propertyType": "farms-ranches",
  "minAcres": 51,
  "maxResults": 100
}
```

**Sold comparables for a county:**

```json
{
  "operation": "search",
  "locations": ["Parker County, TX"],
  "availability": "sold",
  "maxResults": 500
}
```

**Expand specific properties:**

```json
{
  "operation": "detail",
  "propertyUrls": [
    "https://www.landwatch.com/pid/427705576",
    "https://www.landwatch.com/cooke-county-texas-farms-and-ranches-for-sale/pid/422917076"
  ]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **80 fields** including:

| Field | Type | Description |
|-------|------|-------------|
| propertyTitle | string | The listing's name, such as "Rolling R Ranch" |
| price | number | Asking price in USD |
| acres | number | Parcel size |
| pricePerAcre | number | Asking price divided by acreage |
| propertyTypes | array | Farms and Ranches, Hunting Land, Timberland and so on |
| listingStatus | string | available, under contract, sold or off market |
| county / countyFips | string / number | County name and its FIPS code for joining external data |
| latitude / longitude | number | GPS coordinates |
| mineralsAvailable | array | What the seller conveys, such as Oil & Gas or Wind |
| oilGasOwnedPercent | number | Percentage of oil and gas rights included |
| waterRightsPercent | number | Percentage of water rights included |
| roadFrontage | array | Asphalt, County, Gravel and similar |
| topography | array | Rolling, Hilly, Flood Plain, Bottom |
| gameSpecies | array | Whitetail Deer, Turkey, Hog and others |
| priceHistory | array | Every price change with its date and percentage |
| brokerName / brokerPhone | string | The listing agent and how to reach them |

**Example:**

```json
{
  "propertyId": 427705576,
  "propertyTitle": "Rolling R Ranch",
  "url": "https://www.landwatch.com/cooke-county-texas-farms-and-ranches-for-sale/pid/427705576",
  "price": 21500000,
  "acres": 1303.31,
  "pricePerAcre": 16496.46,
  "propertyTypes": ["Farms and Ranches", "Recreational Property", "House"],
  "listingStatus": "available",
  "city": "Era",
  "county": "Cooke County",
  "countyFips": 48097,
  "state": "Texas",
  "zip": "76238",
  "latitude": 33.470332,
  "longitude": -97.413352,
  "beds": 4,
  "baths": 4,
  "homeSqft": 3716,
  "mineralsAvailable": ["Oil & Gas", "Wind"],
  "oilGasOwnedPercent": 50,
  "waterRightsPercent": 100,
  "roadFrontage": ["Asphalt", "County"],
  "topography": ["Rolling", "Hilly", "Varied"],
  "gameSpecies": ["Whitetail Deer", "Turkey", "Dove"],
  "priceHistory": [
    { "date": "2026-08-01", "price": 21500000, "event": "Listed for Sale" }
  ],
  "brokerName": "Blake Hortenstine",
  "brokerCompany": "Hortenstine Ranch Company, LLC",
  "brokerPhone": "(940) 289-5176"
}
```

***

### 💼 Use Cases & Examples

#### 1. Price-per-Acre Comparables

**Appraisers and land brokers build a rural comp set that actually exists.**

**Input:** a county, `availability: sold`, an acreage band around the subject parcel
**Output:** closed price, acreage, price per acre, GPS, property type and sale date on every row
**Use:** rural comps are the hardest number in appraisal to source. LandWatch keeps six figures of closed listings per state, and this pulls them in the same shape as the live ones.

#### 2. Land Investment Screening

**Investors filter a whole state down to the parcels worth a site visit.**

**Input:** a state, `minAcres`, a price ceiling, `includeDetails: true`
**Output:** every parcel in the band with rights percentages, road frontage, topography and price history
**Use:** rank a state by price per acre, then read the detail columns to see which listings convey minerals or water before you spend a day driving.

#### 3. Broker and Agent Lead Lists

**Land brokerages and marketing teams find the agents who actually transact.**

**Input:** any search — a county, a property type, an acreage band
**Output:** agent name, brokerage, phone, city, state and LandWatch profile link on every row
**Use:** the contact block ships with the search row at no extra charge, so a filtered search doubles as a targeted list of the brokers working that ground.

#### 4. Hunting and Recreational Land

**Outfitters and recreational buyers search on the attributes that decide the purchase.**

**Input:** `activity: hunting`, a state, `propertyType: recreational-property`, `includeDetails: true`
**Output:** game species, water features, fencing, topography, utilities and the seller's write-up
**Use:** whitetail versus elk versus hog is a real filter for this buyer, and a generic property feed does not carry it.

#### 5. Mineral, Water and Wind Rights Sourcing

**Energy land teams and agricultural buyers find the listings with unusual terms.**

**Input:** `mineralRights: true` across several states, `includeDetails: true`
**Output:** what the seller conveys, plus the percentage of oil and gas, water and wind owned, and surface rights
**Use:** roughly 400 of Texas's 81,000 listings convey minerals. Finding them by hand means opening every page — here they come back as typed columns you can sort.

#### 6. Owner-Financed Land

**Buyers and note investors surface seller-financed inventory in one pass.**

**Input:** `ownerFinancing: true`, a state or a set of counties, a price band
**Output:** asking price, acreage, financing options, broker contact and the full listing URL
**Use:** owner financing is a first-class LandWatch filter and passes straight through, so a slice most buyers never see becomes a list you can work.

#### 7. Market Monitoring

**Analysts and land funds watch a county without keeping their own history.**

**Input:** the same saved search on a daily or weekly schedule, `includeDetails: true`
**Output:** new listings, status changes and the full price history with every cut, rise and relisting
**Use:** price history ships with the detail record, so a cut is visible on the first run rather than after you have collected months of snapshots.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/landwatch-property-scraper').call({
  operation: 'search',
  locations: ['Montana'],
  propertyType: 'farms-ranches',
  minAcres: 51,
  maxResults: 500
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].propertyTitle, items[0].acres, items[0].pricePerAcre);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/landwatch-property-scraper').call(
    run_input={
        'operation': 'search',
        'locations': ['Parker County, TX'],
        'availability': 'sold',
        'maxResults': 500
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['propertyTitle'], item['acres'], item['pricePerAcre'], item['url'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~landwatch-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "search", "locations": ["Texas"], "mineralRights": true, "includeDetails": true}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule the same search daily or weekly
2. **HTTP Request**: Call the Actor API
3. **Process**: Handle the JSON rows
4. **Action**: Push new parcels to your CRM, a Google Sheet, a map or a Slack alert

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 properties** per run — every field, every filter, the same data
- No credit card required
- Enough to check the columns before you commit to a state

#### PAID Tier (Production Ready)

- **Unlimited** properties per run, across as many locations as you list
- 25 properties per request, so a 1,000-row sweep takes about a minute
- Pay per result: charged for rows delivered, never for a failure

| Metric | Value |
|--------|-------|
| Speed | 25 properties per request, ~1 s per page |
| Coverage | All 50 states, every county and city LandWatch indexes |
| Live inventory | 523,000+ for-sale listings, plus the sold and off-market archives |
| Search ceiling | 500 results per search — passed by splitting on county, city, price and acreage |
| Free tier | 25 properties per run |
| Paid tier | Unlimited |

💰 **From $0.86 per 1,000 properties** at the top tier — among the lowest prices on the Store for this data. Broker contacts and GPS are included in the search row rather than sold as an add-on.

🔗 [View current pricing](https://apify.com/sian.agency/landwatch-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How do I name a county or a city?**
A: Write it the way LandWatch does — "Harris County, TX" or "Fredericksburg, TX". The name is checked against LandWatch's own list for that state, so a misspelling fails with a message instead of quietly returning the whole country.

**Q: How many properties can one search return?**
A: LandWatch caps any single search at 500. Ask for more and the search is split across its own county, city, price and acreage filters until your limit is met, so a whole state comes back rather than its first 500 rows.

**Q: What is the difference between the search and detail operations?**
A: Search takes filters and returns listing rows. Detail takes LandWatch property URLs you already have and returns the full record. To get both in one pass, run a search with Add full property details switched on.

**Q: What does Add full property details cost?**
A: It reads each property's own page, so it bills one Detail Enrichment event per enriched property on top of the search row. Leave it off and you pay for search rows only.

**Q: Where do mineral and water rights come from?**
A: The seller's own declarations on the listing. Percentages are returned when the seller states them, and the fields are empty when they do not — nothing is inferred.

**Q: Can I get sold properties?**
A: Yes. Set Availability to Sold and you get the comparables archive in the same row shape as live listings, including closed price and acreage.

**Q: Does it cover LandsOfAmerica or Land And Farm?**
A: This Actor reads LandWatch. The three sites share inventory, so most of what you would find on the others appears here too, though the row and its fields come from LandWatch.

**Q: Can I paste a LandWatch search URL?**
A: Yes. Put it in Search URLs and every filter already in that URL carries through. Use the form landwatch.com/texas-land-for-sale/harris-county, since the reversed form is a URL LandWatch answers with the whole country.

**Q: What output formats are available?**
A: JSON, CSV and Excel, straight from the Apify dataset, or over the API in your own code.

**Q: Do I need a proxy or an API key?**
A: No. Name a state and press Start.

***

### 🐛 Troubleshooting

**"Not a location LandWatch carries"**

- Use the state name on its own, or "County Name County, ST" / "City, ST"
- Check the spelling on LandWatch's own state page — the county list there is what gets matched
- Two-letter state codes belong after the comma, not on their own

**Fewer properties than expected**

- A single search stops at LandWatch's 500-result ceiling; raise Max properties and the search splits by county, city, price and acreage to keep going
- Narrow filters genuinely match little. Mineral rights across one small county can be a handful of listings
- Free accounts are capped at 25 rows per run

**Rights, topography or price history columns are empty**

- Those fields only arrive with Add full property details switched on, or from the Property Detail operation
- Even then they are the seller's declarations, so a bare lot with no write-up leaves them empty

**A property URL returns nothing**

- Sold and withdrawn listings are removed from LandWatch after a while
- Check the ID against the live page, or re-run the search to pick up current listings

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- 🐛 Found a bug? File an issue in the Apify Console Issues tab
- ⭐ Loving the tool? Leave a 5-star review — it helps us build more
- 🛠️ More automation tools in the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian)
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

LandWatch is a trademark of Land.com / CoStar Group. This actor is not affiliated with, endorsed by, or sponsored by LandWatch.

# Actor input Schema

## `operation` (type: `string`):

Pick one per run. Property Search returns listing rows for any state, county or city, with LandWatch's own filters applied. Property Detail takes LandWatch property URLs you already have and returns the full record: mineral, water and wind rights, road frontage, topography and price history.

## `locations` (type: `array`):

Where to search. A state on its own ('Texas', 'Montana'), a county ('Harris County, TX'), or a city ('Fredericksburg, TX'). County and city names are resolved against LandWatch's own facet list, so a name it does not carry fails loudly instead of quietly returning the whole country. One search runs per location.

## `propertyType` (type: `string`):

Narrow to one land type. To combine several — farms and ranches plus hunting land, say — paste a LandWatch URL that stacks them into Search URLs instead.

## `availability` (type: `string`):

Which market status to return. 'Sold' is the comparables archive — the same row shape with the closed listings, which is what you want for a price-per-acre study rather than a buyer search.

## `minPrice` (type: `integer`):

Lowest asking price to include. 0 means no lower bound. LandWatch buckets price rather than taking a free range, so the nearest band that contains your number is used.

## `maxPrice` (type: `integer`):

Highest asking price to include. 0 means no upper bound.

## `minAcres` (type: `integer`):

Smallest parcel to include. 0 means no lower bound. LandWatch buckets acreage into bands, so the nearest band that contains your number is used.

## `maxAcres` (type: `integer`):

Largest parcel to include. 0 means no upper bound.

## `minBeds` (type: `integer`):

Only properties with a residence of at least this many bedrooms. 0 ignores bedrooms entirely, which is what most land searches want.

## `hasResidence` (type: `string`):

Whether the parcel has a house on it. 'Bare land only' is the usual filter for a development or recreation search.

## `mineralRights` (type: `boolean`):

Only listings where the seller conveys mineral rights. This is a small, high-value slice — roughly 400 of Texas's 81,000 listings — so expect few rows and pair it with a wide location.

## `ownerFinancing` (type: `boolean`):

Only listings the seller will finance directly.

## `activity` (type: `string`):

Only land LandWatch tags for this use. The tag is the seller's own declaration, so it is a strong filter on recreational listings and absent on most bare lots.

## `maxResults` (type: `integer`):

Stop after this many properties across all locations. Each page returns 25, so the run stops at the first page that crosses your limit. Ask for more than 500 from one location and the search is split across LandWatch's own county, city, price and acreage facets to get past its 500-result ceiling.

## `includeDetails` (type: `boolean`):

Read each property's own page to add the seller's full write-up, highlights, mineral, water and wind rights, road frontage, topography, game species, utilities, price history and attached plats or surveys. Costs one extra request per property and bills the Detail Enrichment event on top of the search row.

## `propertyUrls` (type: `array`):

Used by the Property Detail operation: LandWatch property page URLs. Both the full /county-state-.../pid/123 form and the short https://www.landwatch.com/pid/123 form work, so the id on its own is enough as long as you wrap it in the short URL — Apify rejects a bare number in a URL field before the run starts.

## `searchUrls` (type: `array`):

Paste LandWatch search URLs instead of filling the fields above — every filter already in the URL carries through. Use the form landwatch.com/texas-land-for-sale/harris-county/acres-51-100, never landwatch.com/harris-county-texas-land-for-sale: the second is a URL LandWatch answers with the whole country.

## Actor input object example

```json
{
  "operation": "search",
  "locations": [
    "Texas"
  ],
  "propertyType": "any",
  "availability": "available",
  "minPrice": 0,
  "maxPrice": 0,
  "minAcres": 0,
  "maxAcres": 0,
  "minBeds": 0,
  "hasResidence": "any",
  "mineralRights": false,
  "ownerFinancing": false,
  "activity": "any",
  "maxResults": 100,
  "includeDetails": false,
  "propertyUrls": [],
  "searchUrls": []
}
```

# Actor output Schema

## `landwatchProperties` (type: `string`):

Every propertie this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "locations": [
        "Texas"
    ],
    "propertyType": "any",
    "availability": "available",
    "minPrice": 0,
    "maxPrice": 0,
    "minAcres": 0,
    "maxAcres": 0,
    "minBeds": 0,
    "hasResidence": "any",
    "mineralRights": false,
    "ownerFinancing": false,
    "activity": "any",
    "maxResults": 100,
    "includeDetails": false,
    "propertyUrls": [],
    "searchUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/landwatch-property-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 = {
    "operation": "search",
    "locations": ["Texas"],
    "propertyType": "any",
    "availability": "available",
    "minPrice": 0,
    "maxPrice": 0,
    "minAcres": 0,
    "maxAcres": 0,
    "minBeds": 0,
    "hasResidence": "any",
    "mineralRights": False,
    "ownerFinancing": False,
    "activity": "any",
    "maxResults": 100,
    "includeDetails": False,
    "propertyUrls": [],
    "searchUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/landwatch-property-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 '{
  "operation": "search",
  "locations": [
    "Texas"
  ],
  "propertyType": "any",
  "availability": "available",
  "minPrice": 0,
  "maxPrice": 0,
  "minAcres": 0,
  "maxAcres": 0,
  "minBeds": 0,
  "hasResidence": "any",
  "mineralRights": false,
  "ownerFinancing": false,
  "activity": "any",
  "maxResults": 100,
  "includeDetails": false,
  "propertyUrls": [],
  "searchUrls": []
}' |
apify call sian.agency/landwatch-property-scraper --silent --output-dataset

```

## MCP server setup

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