{
  "openapi": "3.0.1",
  "info": {
    "title": "LandWatch Scraper - Land, Farm & Ranch Listings",
    "description": "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.",
    "version": "1.0",
    "x-build-id": "vTocb1XBrezHq73cO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~landwatch-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-landwatch-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/sian.agency~landwatch-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-landwatch-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/sian.agency~landwatch-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-landwatch-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "operation": {
            "title": "🎯 What do you want to scrape?",
            "enum": [
              "search",
              "detail"
            ],
            "type": "string",
            "description": "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.",
            "default": "search"
          },
          "locations": {
            "title": "📍 Locations",
            "type": "array",
            "description": "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.",
            "default": [
              "Texas"
            ],
            "items": {
              "type": "string"
            }
          },
          "propertyType": {
            "title": "🏞️ Property type",
            "enum": [
              "any",
              "undeveloped-land",
              "homesites",
              "homes",
              "farms-ranches",
              "recreational-property",
              "hunting-property",
              "timberland",
              "waterfront-property",
              "lakefront-property",
              "riverfront-property",
              "beachfront-property",
              "horse-property",
              "commercial-property"
            ],
            "type": "string",
            "description": "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.",
            "default": "any"
          },
          "availability": {
            "title": "📌 Availability",
            "enum": [
              "available",
              "under-contract",
              "sold",
              "off-market",
              "any"
            ],
            "type": "string",
            "description": "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.",
            "default": "available"
          },
          "minPrice": {
            "title": "💵 Min price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "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.",
            "default": 0
          },
          "maxPrice": {
            "title": "💰 Max price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest asking price to include. 0 means no upper bound.",
            "default": 0
          },
          "minAcres": {
            "title": "📐 Min acres",
            "minimum": 0,
            "type": "integer",
            "description": "Smallest parcel to include. 0 means no lower bound. LandWatch buckets acreage into bands, so the nearest band that contains your number is used.",
            "default": 0
          },
          "maxAcres": {
            "title": "🗺️ Max acres",
            "minimum": 0,
            "type": "integer",
            "description": "Largest parcel to include. 0 means no upper bound.",
            "default": 0
          },
          "minBeds": {
            "title": "🛏️ Min bedrooms",
            "minimum": 0,
            "maximum": 4,
            "type": "integer",
            "description": "Only properties with a residence of at least this many bedrooms. 0 ignores bedrooms entirely, which is what most land searches want.",
            "default": 0
          },
          "hasResidence": {
            "title": "🏠 Residence on the land",
            "enum": [
              "any",
              "yes",
              "no"
            ],
            "type": "string",
            "description": "Whether the parcel has a house on it. 'Bare land only' is the usual filter for a development or recreation search.",
            "default": "any"
          },
          "mineralRights": {
            "title": "⛏️ Mineral rights only",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "ownerFinancing": {
            "title": "🤝 Owner financing only",
            "type": "boolean",
            "description": "Only listings the seller will finance directly.",
            "default": false
          },
          "activity": {
            "title": "🎯 Activity",
            "enum": [
              "any",
              "hunting",
              "fishing",
              "horseback-riding",
              "camping",
              "boating",
              "off-roading",
              "rving",
              "golfing",
              "beach"
            ],
            "type": "string",
            "description": "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.",
            "default": "any"
          },
          "maxResults": {
            "title": "🔢 Max properties",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "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.",
            "default": 100
          },
          "includeDetails": {
            "title": "📄 Add full property details",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "propertyUrls": {
            "title": "🔗 Property URLs",
            "type": "array",
            "description": "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.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchUrls": {
            "title": "🌐 Search URLs",
            "type": "array",
            "description": "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.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}