# Landwatch.com Scraper | Enterprise Grade (`fatihtahta/landwatch-scraper`) Actor

Extract 400k+ US property listings from LandWatch with pricing, property details, broker contacts, full media, listing history and more. Built for enterprise-grade land intelligence, investment screening, lead enrichment, and automated real estate data pipelines.

- **URL**: https://apify.com/fatihtahta/landwatch-scraper.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 25 total users, 8 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 results

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?

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.com Scraper

**Slug:** `fatihtahta/lanswatch-com-scraper`

### Overview

LandWatch.com Scraper collects structured public real estate listing data from LandWatch, including listing identity, title, description, pricing, acreage, residential attributes, location, broker details, media, features, listing history, and related listing context. [LandWatch](https://www.landwatch.com) is a public marketplace for land, acreage, farms, ranches, homesites, recreational property, and other rural real estate, making its listings useful for market research, lead qualification, investment screening, and inventory monitoring. The actor converts search and filter configurations into repeatable dataset outputs that are easier to analyze than manual browsing. It is designed for automated, recurring data acquisition where consistent JSON records, predictable limits, and operational review matter. Use it to support dependable collection workflows without assuming that every listing, field, or source-side attribute will be available in every run.

### Why Use This Actor

- **Market research and analytics teams:** build market intelligence datasets for supply, price, acreage, property-type mix, broker activity, and regional inventory trends.
- **Product and content teams:** populate internal directories, comparison experiences, editorial research, or property discovery workflows with normalized listing data.
- **Developers and data engineering teams:** feed structured extraction results into downstream systems, ETL jobs, warehouses, enrichment pipelines, and operational reporting.
- **Lead generation and enrichment teams:** identify public broker, seller, and property attributes that can support qualification, segmentation, and CRM enrichment.
- **Monitoring and competitive tracking teams:** schedule repeatable collection to detect changes in pricing, availability, listing updates, and market movement over time.

### Common Use Cases

- **Market intelligence:** monitor land supply, pricing, price-per-acre movement, acreage bands, listing availability, and geographic coverage.
- **Lead generation:** build targeted prospect lists from public land, farm, ranch, residential, and broker listing data.
- **Competitive monitoring:** track changes in listings, pricing, property categories, broker inventory, and recently updated records.
- **Catalog and directory building:** populate internal real estate databases with structured public listing records.
- **Data enrichment:** add current public property, location, broker, media, and feature attributes to CRM, BI, or analytics datasets.
- **Recurring reporting:** schedule periodic runs for dashboards, alerts, market summaries, and trend analysis.

### Quick Start

1. Choose the listing scope with `deal_type` and `availability`.
2. Add a `location`, `property_type`, keyword, pricing, acreage, timing, or feature filters when you need a narrower dataset.
3. Set a small `limit`, such as 25 or 50, for the first validation run.
4. Run the actor in Apify Console.
5. Inspect the first dataset records to confirm that the output shape and field coverage match your use case.
6. Increase coverage, adjust filters, enable scheduling, or use `maximize_coverage` and `enrich_data` once the output is verified.

### Input Parameters

This actor accepts LandWatch search scope, location, property, timing, feature, price, acreage, building, bedroom, bathroom, sorting, limit, coverage, and enrichment controls.

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `deal_type` | string | Listing deal type. Allowed values: `for_sale`, `auction`. Leave empty to avoid limiting by deal type. | – |
| `availability` | array of strings | Listing statuses to include. Allowed values: `buy`, `under_contract`, `off_market`, `sold`. | `["buy", "under_contract"]` |
| `location` | string | Free-text location such as `California`, `Los Angeles County CA`, or `Ramona CA`. | – |
| `property_type` | string | Property category. Allowed values: `commercial`, `farms_and_ranches`, `homesite`, `horse`, `house`, `hunting`, `lakefront`, `oceanfront`, `recreational`, `riverfront`, `timberland`, `undeveloped`, `waterfront`. | – |
| `price_reduction_period` | string | Only include listings with a price reduction in the selected window. Allowed values: `3_days`, `7_days`, `30_days`, `60_days`, `90_days`. | – |
| `publication_date` | string | Only include listings first published in the selected window. Allowed values: `1_day`, `7_days`, `30_days`, `60_days`. | – |
| `keyword` | string | Keyword or phrase used to focus matching listings. | – |
| `owner_financing` | boolean | Include only listings that offer owner financing. | `false` |
| `mineral_rights` | boolean | Include only listings that mention mineral rights. | `false` |
| `virtual_tour` | boolean | Include only listings that provide a virtual tour. | `false` |
| `exterior_tour` | boolean | Include only listings that provide an exterior tour. | `false` |
| `property_video` | boolean | Include only listings that provide a property video. | `false` |
| `custom_map` | boolean | Include only listings that provide a custom map. | `false` |
| `min_price` | integer | Minimum listing price in USD. Must be 0 or greater. | – |
| `max_price` | integer | Maximum listing price in USD. Must be 0 or greater. | – |
| `min_area_parcel` | number | Minimum parcel size in acres. Must be 0 or greater. | – |
| `max_area_parcel` | number | Maximum parcel size in acres. Must be 0 or greater. | – |
| `min_area_building` | number | Minimum building size in square feet. Must be 0 or greater. | – |
| `max_area_building` | number | Maximum building size in square feet. Must be 0 or greater. | – |
| `min_bedroom` | integer | Minimum number of bedrooms. Must be 0 or greater. | – |
| `max_bedroom` | integer | Maximum number of bedrooms. Must be 0 or greater. | – |
| `min_bathroom` | integer | Minimum number of bathrooms. Must be 0 or greater. | – |
| `max_bathroom` | integer | Maximum number of bathrooms. Must be 0 or greater. | – |
| `sort_by` | string | Result order. Allowed values: `default`, `acres_small_to_large`, `acres_large_to_small`, `newest`, `price_low_to_high`, `price_high_to_low`, `price_per_acre_low_to_high`, `price_per_acre_high_to_low`, `recently_changed`. | `default` |
| `limit` | integer | Maximum number of listings to save for each location. Must be 1 or greater. Leave empty to collect all available matching listings. | – |
| `maximize_coverage` | boolean | Collect a broader set of matching listings for production-style runs. Disable for faster exploratory runs. | `true` |
| `enrich_data` | boolean | Include richer listing details such as descriptions, parcel identifiers, amenities, listing history, media, and broker contact details when available. | `true` |

### Choosing Inputs

Use `location` when you need a state, county, city, or local-market view. Add `property_type`, price, parcel acreage, building size, bedroom, bathroom, feature, and timing filters when the goal is a targeted dataset; leave optional filters empty when the goal is broader discovery. Narrower filters produce cleaner, more focused output, while broader filters improve coverage and are better for exploratory market analysis. Use `publication_date`, `price_reduction_period`, and `sort_by` for monitoring workflows where freshness, recent changes, or ordered review matters. Start with a small `limit` to validate record shape and field coverage, then increase the limit or enable broader collection once the output is ready for downstream use.

### Example Inputs

#### Location and category validation run

```json
{
  "deal_type": "for_sale",
  "availability": ["buy", "under_contract"],
  "location": "Bland County VA",
  "property_type": "farms_and_ranches",
  "sort_by": "newest",
  "limit": 25,
  "enrich_data": true
}
```

#### Recently changed price monitoring

```json
{
  "availability": ["buy"],
  "location": "Virginia",
  "price_reduction_period": "30_days",
  "min_price": 100000,
  "max_price": 750000,
  "sort_by": "recently_changed",
  "limit": 100
}
```

#### Broad discovery with conservative output

```json
{
  "deal_type": "for_sale",
  "availability": ["buy"],
  "keyword": "waterfront",
  "min_area_parcel": 10,
  "property_type": "waterfront",
  "limit": 50,
  "maximize_coverage": true,
  "enrich_data": false
}
```

### Output

#### Output destination

The actor writes results to the default Apify dataset as normalized JSON records. The public dataset currently uses one record family: `property_listing`.

#### Record envelope and stable identifiers

Each record uses `record_type` as the discriminator and `record_id` as the recommended primary idempotency key. Use `source_context.fingerprint` as a compact change-detection value when comparing repeated runs, and keep `source_context.external_ids` for source-specific joins.

#### Example

Example: LandWatch property listing record

```json
{
  "record_type": "property_listing",
  "record_id": 417486633,
  "source_context": {
    "source_url": "https://www.landwatch.com/api/property/search/1113/california-land-for-sale/for-sale",
    "seed_id": "fd8c31faa63e",
    "seed_type": "url",
    "seed_value": "https://www.landwatch.com/api/property/search/1113/california-land-for-sale/for-sale",
    "page_index": 0,
    "domain": "www.landwatch.com",
    "external_ids": {
      "landwatch_property_id": 417486633,
      "listing_id": 18080155,
      "parcel_id": "0|225|2861115000|1"
    },
    "fingerprint": "42ca83d6b06e1df20e9a"
  },
  "entity": {
    "title": "Ballena Vista Farm",
    "description": "Discover Ballena Vista Farm: Where Legacy, Luxury and Lifestyle Converge.",
    "url": "https://www.landwatch.com/san-diego-county-california-farms-and-ranches-for-sale/pid/417486633"
  },
  "listing": {
    "listing_id": 18080155,
    "listing_date": "2023-08-27",
    "parcel_id": "0|225|2861115000|1",
    "external_url": "https://donn.com/listings/ballena-vista-farm/",
    "updated_at": "February 22, 2026 at 10:44 AM"
  },
  "pricing": {
    "price": 12900000.0,
    "price_text": "$12,900,000",
    "price_per_acre": 75882.35
  },
  "location": {
    "address": "26353 Old Julian Highway",
    "city": "Ramona",
    "county": "San Diego County",
    "state": "California",
    "state_code": "CA",
    "postal_code": "92065",
    "coordinates": {
      "latitude": 33.05823,
      "longitude": -116.75506
    },
    "geocode_accuracy": 9
  },
  "property": {
    "acres": 170.0,
    "acres_text": "170 acres",
    "beds": 5,
    "beds_text": "5 beds",
    "baths": 4,
    "baths_text": "4 baths",
    "home_sqft": 6169,
    "home_sqft_text": "6,169 sqft",
    "types": ["Farms and Ranches", "Horse Property", "House"],
    "types_text": "Farms and Ranches, Horse Property, House"
  },
  "media": {
    "thumbnail_url": "https://assets.landwatch.com/resizedimages/394/0/h/80/5046472282",
    "image_count": 49,
    "image_document_ids": [5046472282],
    "images": [
      {
        "document_id": 5046472282,
        "url": "https://assets.landwatch.com/resizedimages/394/0/h/80/5046472282",
        "image_id": 1485857478,
        "label": "8",
        "width": 1920,
        "height": 1280
      }
    ]
  },
  "contact_details": {
    "broker_name": "Donn Bree & Meriah Druliner",
    "broker_company": "Red Hawk Realty",
    "phone": "(800) 371-6669",
    "profile_url": "https://www.landwatch.com/profile/donn-bree-meriah-druliner/53052",
    "website": "www.redhawkrealty.com/",
    "city": "Santa Ysabel",
    "state": "CA"
  },
  "metrics": {
    "image_count": 49
  },
  "attributes": {
    "features": {
      "amenities": ["Equestrian", "Vineyard", "Solar"]
    },
    "history": {
      "events": []
    },
    "map": {
      "static_map_url": "https://maps.googleapis.com/maps/api/staticmap?..."
    }
  }
}
```

#### Field reference

**record_type** *(string, required)*: Public dataset discriminator. Current value: `property_listing`.

**record_id** *(integer or string, required)*: Stable LandWatch listing or property identifier and recommended primary upsert key.

**source_context.source_url / detail_api_url / seed_id / seed_type / seed_value / page_index / domain** *(string or integer, optional)*: Source and seed context for tracing where the record came from.

**source_context.external_ids** *(object, optional)*: Source-specific IDs such as `landwatch_property_id`, `site_listing_id`, `listing_id`, `source_record_id`, `laf_property_id`, account IDs, parcel ID, MLS ID, partner IDs, and participant keys.

**source_context.breadcrumbs\[]** *(array, optional)*: Source breadcrumb paths and location labels.

**source_context.fingerprint** *(string, optional)*: Compact stable fingerprint for repeated-run change detection.

**entity.title / description / url** *(string, optional)*: Human-facing listing title, public description, and listing URL.

**listing** *(object, optional)*: Listing status, listing dates, update timestamps, parcel reference, external public URL, placement metadata, market status, and auction-specific fields when present.

**pricing** *(object, optional)*: Price, display price, short price label, price per acre, recent price-change values, sales price, and sales date.

**location** *(object, optional)*: Address, city, county, state, postal code, location IDs, region data, coordinates, geocode accuracy, county/city links, and nearby county context.

**property** *(object, optional)*: Acreage, building size, bedroom and bathroom counts, property category labels and IDs, residential/irrigation/listing flags, executive summary, directions, disclaimer, highlights, and public category links.

**media** *(object, optional)*: Thumbnail, image counts, image document IDs, image records, videos, virtual tours, third-party map links, Matterport/Vimeo/Kuula media, floorplans, attachments, and seller files.

**contact_details** *(object, optional)*: Broker or seller name, company, phone values, profile URL, website, office location, license number, and public profile/logo document IDs.

**relationships.broker** *(object, optional)*: Broker account metadata, active/certification flags, seller flag, account lifecycle dates, and SMS notification setting.

**relationships.related_listings** *(object, optional)*: Related active or sold listing summaries with their own compact identity, pricing, property, location, broker, media, and listing metadata.

**metrics** *(object, optional)*: Compact numeric signals such as `image_count`, `price_change_amount`, and `price_change_percentage`.

**attributes** *(object, optional)*: LandWatch-specific listing flags, feature booleans, amenity groups, listing history, map overlays, SEO metadata, source schema objects, and finance-center details that do not belong in the shared real estate groups.

### Data Quality, Guarantees, And Handling

- **Structured records:** results are normalized into predictable JSON objects for downstream use.
- **Best-effort extraction:** fields may vary by region, session, availability, account visibility, listing type, source data quality, or UI experiments.
- **Optional fields:** null-check optional values in downstream code, especially `contact_details`, `media`, `attributes`, and `relationships`.
- **Deduplication:** use `record_id` as the strongest stable key available from the output, with `entity.url` and `source_context.fingerprint` as secondary checks.
- **Freshness:** results reflect the publicly available data at run time.
- **Repeated runs:** use the recommended idempotency key when syncing data into warehouses, CRMs, or search indexes.

### Tips For Best Results

- Start with a small `limit` to validate the output shape before scaling up.
- Use one geography, property category, or market segment per run when you need cleaner segmentation.
- Leave optional filters empty when the goal is broad discovery.
- Add filters gradually to understand how each field changes coverage.
- Use `publication_date`, `price_reduction_period`, and `sort_by` for monitoring newly published or recently changed listings.
- Schedule recurring runs for monitoring workflows instead of relying on manual one-off collection.
- Store records by `record_id` and compare `source_context.fingerprint` when tracking changes over time.

### How to Run on Apify

1. Open the Actor in Apify Console.
2. Configure the available input fields for the target scope.
3. Set the maximum number of outputs to collect with `limit`.
4. Click **Start** and wait for the run to finish.
5. Inspect the dataset preview.
6. Download results in JSON, CSV, Excel, or another supported format.

### Scheduling & Automation

#### Scheduling

**Automated Data Collection**

Schedule recurring runs to keep LandWatch listing datasets fresh for monitoring, reporting, and enrichment workflows. Use the same validated input configuration for consistent collection over time.

- Navigate to **Schedules** in Apify Console
- Create a new schedule, such as daily, weekly, or custom cron
- Configure input parameters
- Enable notifications for run completion
- Add webhooks for automated processing

#### Integration Options

- **CRM enrichment:** sync public listing, broker, location, acreage, and pricing attributes into account or lead records.
- **BI dashboards:** monitor pricing, availability, property-type movement, acreage bands, and geographic coverage over time.
- **Data warehouses:** retain historical listing snapshots for market intelligence, trend analysis, and operational reporting.
- **Webhooks:** trigger validation, notification, or ingestion workflows after each completed run.
- **Google Sheets or Airtable:** review smaller datasets, qualify leads, and coordinate lightweight market research workflows.
- **Alerts:** notify teams when new, recently changed, or price-reduced listings match a saved scope.

### Export Formats And Downstream Use

Apify datasets can be exported or consumed by downstream systems for analysis, review, and operational use.

- **JSON:** for APIs, applications, and data pipelines
- **CSV or Excel:** for spreadsheet workflows and manual review
- **API access:** for automated ingestion into internal systems
- **BI and warehouses:** for reporting, dashboards, and historical analysis

### Performance

Estimated run times:

- **Small runs (< 1,000 outputs):** ~3-5 minutes
- **Medium runs (1,000-5,000 outputs):** ~5-15 minutes
- **Large runs (5,000+ outputs):** ~15-30 minutes

Execution time varies based on filters, result volume, and how much information is returned per record. Highly filtered runs can finish faster, while broad discovery or detail-rich records may take longer.

### Limitations

- Availability depends on what [LandWatch](https://www.landwatch.com) publicly exposes at run time.
- Some optional fields may be missing on sparse listings, regional pages, older records, or records with limited broker or media information.
- Very broad searches may take longer or require higher limits to collect the desired volume.
- Target-side changes can affect field availability, labels, or naming.
- Regional, account, or availability differences may change which records are visible for the same input scope.
- Listing freshness reflects the public source state at the time the actor runs.

### Troubleshooting

- **No results returned:** check filters, location or category spelling, and whether LandWatch has matching public records for the selected scope.
- **Fewer results than expected:** broaden filters, raise `limit`, or verify that the target contains enough matching records.
- **Some fields are empty:** optional fields depend on what each record publicly provides.
- **Run takes longer than expected:** reduce scope, lower `limit` for validation, or split broad collection into smaller segments.
- **Output changed:** compare the current output with the field reference and report a small sample if support is needed.

### FAQ

#### What data does this actor collect?

It collects public LandWatch listing records, including listing identity, source context, public URLs, descriptions, pricing, acreage, property details, location, contact details, media, amenities, listing history, related listings, SEO metadata, and stable identifiers when available.

#### Can I filter by location, category, date, price, or other criteria?

Yes. The input schema supports `location`, `property_type`, `publication_date`, `price_reduction_period`, keyword search, feature flags, price range, parcel size, building size, bedroom and bathroom counts, availability, deal type, and sorting.

#### Why did I receive fewer results than my limit?

`limit` is a maximum, not a guarantee. The final count depends on how many public listings match the configured scope and filters at run time.

#### Can I schedule recurring runs?

Yes. Use Apify schedules to run the actor daily, weekly, or with a custom cron expression for monitoring and reporting workflows.

#### How do I avoid duplicates across runs?

Use `record_id` as the primary idempotency key. You can also compare `entity.url` and `source_context.fingerprint` when detecting changes or validating repeated runs.

#### Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets support exports such as JSON, CSV, Excel, and other platform-supported formats.

#### Does this actor collect private data?

No. The actor is intended to collect publicly available listing information from LandWatch. Users are responsible for using the data lawfully and appropriately.

#### What should I include when reporting an issue?

Include the input used with sensitive values removed, the run ID, expected versus actual behavior, and a small output sample if it helps illustrate the problem.

### Compliance & Ethics

#### Responsible Data Collection

This actor collects publicly available real estate listing information from **https://www.landwatch.com** for legitimate business purposes, including:

- **Real estate and land market** research and market analysis
- **Lead qualification and enrichment** for public property and broker records
- **Inventory monitoring and reporting** for pricing, availability, and regional trends

This section is informational and not legal advice. Users are responsible for ensuring that their collection, storage, and use of data comply with applicable laws, regulations, and contractual obligations.

#### Best Practices

- Use collected data in accordance with applicable laws, regulations, and the target site’s terms
- Respect individual privacy and personal information
- Use data responsibly and avoid disruptive or excessive collection
- Do not use this actor for spamming, harassment, or other harmful purposes
- Follow relevant data protection requirements where applicable, such as GDPR and CCPA

### Support

For help, use the actor page or Issues section. Include the input used with any sensitive values redacted, the run ID, expected versus actual behavior, and a small output sample when it helps explain the issue. Avoid including private, confidential, or unnecessary personal data in support requests.

# Actor input Schema

## `deal_type` (type: `string`):

Select the listing deal type to include in the core scope. Leave empty when you do not want to limit results to a specific deal type.

## `availability` (type: `array`):

Select one or more listing statuses for the core scope. The default captures properties for sale and properties under contract.

## `location` (type: `string`):

Enter a free-text location such as California, Los Angeles County CA, or Ramona CA. Leave empty to collect listings without a location filter.

## `property_type` (type: `string`):

Select a property category when your workflow needs a focused segment such as farms and ranches, waterfront land, hunting land, or undeveloped parcels.

## `price_reduction_period` (type: `string`):

Only include listings with a price reduction during the selected period. Leave empty to include listings whether or not the price was recently reduced.

## `publication_date` (type: `string`):

Only include listings first published during the selected period. Leave empty when listing age should not narrow the dataset.

## `keyword` (type: `string`):

Enter a keyword or phrase to focus the search on listings that match that text. Leave empty for broader discovery.

## `owner_financing` (type: `boolean`):

Include only listings that offer owner financing.

## `mineral_rights` (type: `boolean`):

Include only listings that mention mineral rights.

## `virtual_tour` (type: `boolean`):

Include only listings that provide a virtual tour.

## `exterior_tour` (type: `boolean`):

Include only listings that provide an exterior tour.

## `property_video` (type: `boolean`):

Include only listings that provide a property video.

## `custom_map` (type: `boolean`):

Include only listings that provide a custom map.

## `min_price` (type: `integer`):

Only include listings priced at or above this amount. Leave empty when there is no minimum price requirement.

## `max_price` (type: `integer`):

Only include listings priced at or below this amount. Leave empty when there is no maximum price requirement.

## `min_area_parcel` (type: `number`):

Only include listings with parcel area at or above this number of acres. Leave empty when smaller parcels are acceptable.

## `max_area_parcel` (type: `number`):

Only include listings with parcel area at or below this number of acres. Leave empty when larger parcels are acceptable.

## `min_area_building` (type: `number`):

Only include listings with building area at or above this square footage. Leave empty when there is no minimum building-size requirement.

## `max_area_building` (type: `number`):

Only include listings with building area at or below this square footage. Leave empty when there is no maximum building-size requirement.

## `min_bedroom` (type: `integer`):

Only include listings with at least this many bedrooms. Leave empty when bedroom count should not limit results.

## `max_bedroom` (type: `integer`):

Only include listings with no more than this many bedrooms. Leave empty when there is no upper bedroom limit.

## `min_bathroom` (type: `integer`):

Only include listings with at least this many bathrooms. Leave empty when bathroom count should not limit results.

## `max_bathroom` (type: `integer`):

Only include listings with no more than this many bathrooms. Leave empty when there is no upper bathroom limit.

## `sort_by` (type: `string`):

Select the order used for matching listings. The default keeps LandWatch's standard ordering.

## `limit` (type: `integer`):

Maximum number of listings to save for each location. Leave empty to collect all available listings that match your configuration.

## `maximize_coverage` (type: `boolean`):

Keep enabled to collect a broader set of listings that match your filters. Turn off for faster exploratory runs where a smaller visible result set is enough.

## `enrich_data` (type: `boolean`):

Enable this for more complete listings. These extra details are useful for analysis, lead qualification, comparable review, and downstream CRM workflows. This may make the run slower because the actor may spend more time collecting details for each result. Turn it off for faster runs when the standard result fields are enough.

## Actor input object example

```json
{
  "availability": [
    "buy",
    "under_contract"
  ],
  "owner_financing": false,
  "mineral_rights": false,
  "virtual_tour": false,
  "exterior_tour": false,
  "property_video": false,
  "custom_map": false,
  "sort_by": "default",
  "limit": 100,
  "maximize_coverage": true,
  "enrich_data": true
}
```

# Actor output Schema

## `results` (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 = {
    "availability": [
        "buy",
        "under_contract"
    ],
    "limit": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/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 = {
    "availability": [
        "buy",
        "under_contract",
    ],
    "limit": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/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 '{
  "availability": [
    "buy",
    "under_contract"
  ],
  "limit": 100
}' |
apify call fatihtahta/landwatch-scraper --silent --output-dataset

```

## MCP server setup

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