{
  "openapi": "3.0.1",
  "info": {
    "title": "willhaben Scraper & New-Listing Monitor - Austria Property",
    "description": "Turn monitoring on and every later run returns only the listings it has not returned before, so you are never charged for the same property twice. Every willhaben.at listing as clean JSON: price with its meaning, price per m2, rooms, area, postcode, coordinates. No private sellers named. Unofficial.",
    "version": "0.1",
    "x-build-id": "x2f3vGqs15U3FIwqn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~willhaben-listings/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-willhaben-listings",
        "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/neverempty~willhaben-listings/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-willhaben-listings",
        "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/neverempty~willhaben-listings/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-willhaben-listings",
        "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": {
          "searchUrl": {
            "title": "willhaben search URL (optional)",
            "type": "string",
            "description": "Paste a willhaben property listing page, for example https://www.willhaben.at/iad/immobilien/eigentumswohnung/wien or https://www.willhaben.at/iad/immobilien/mietwohnungen/wien/wien-1020-leopoldstadt, and the three fields below are ignored. Query parameters are dropped (willhaben's robots.txt forbids price and keyword parameters), so every filter runs here on the rows already fetched."
          },
          "category": {
            "title": "Category",
            "enum": [
              "flat-buy",
              "flat-rent",
              "house-buy",
              "house-rent",
              "land"
            ],
            "type": "string",
            "description": "The five willhaben property categories checked on live pages.",
            "default": "flat-buy"
          },
          "state": {
            "title": "State (Bundesland)",
            "type": "string",
            "description": "wien, niederoesterreich, oberoesterreich, salzburg, tirol, vorarlberg, kaernten, steiermark, burgenland - as willhaben writes them (umlauts become ae/oe/ue). Leave empty for the whole of Austria. A state willhaben does not know comes back as a no-such-search row (willhaben answers 404), not as an empty result.",
            "default": "wien"
          },
          "district": {
            "title": "District or town (optional)",
            "type": "string",
            "description": "As willhaben writes it in its addresses: wien-1020-leopoldstadt, salzburg-stadt, graz. Needs the state.",
            "default": ""
          },
          "maxListings": {
            "title": "Maximum properties",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many properties to return. You are charged for the rows you actually receive.",
            "default": 20
          },
          "maxPages": {
            "title": "Maximum listing pages to open",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "A hard stop on how many pages are requested, whatever the filters do. 0 lets the run work it out.",
            "default": 0
          },
          "includeDescription": {
            "title": "Include the description text",
            "type": "boolean",
            "description": "The listing text willhaben shows on the card. Turn it off for a smaller dataset - the keyword filter still searches it either way.",
            "default": true
          },
          "useProxy": {
            "title": "Use an Apify proxy",
            "type": "boolean",
            "description": "Off by default because willhaben answers Apify's own network directly. If willhaben ever starts blocking, the run switches to a proxy on its own.",
            "default": false
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only listings whose title, description, type, address, district, outdoor spaces or agency contain these words. No extra requests are made.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "any: at least one keyword. all: every keyword.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop listings containing any of these words.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "agencyNames": {
            "title": "Agencies",
            "type": "array",
            "description": "Keep only listings marketed by these agencies. Partial names work.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "A sale price is a total; a rent is per month, the way willhaben publishes it. 0 means no minimum.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "0 means no maximum. A listing whose price is 'Preis auf Anfrage' (on request) is kept.",
            "default": 0
          },
          "maxPricePerSqm": {
            "title": "Maximum price per m² (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "willhaben's own figure. 0 means no maximum.",
            "default": 0
          },
          "requirePrice": {
            "title": "Only listings with a published price",
            "type": "boolean",
            "description": "Off by default: a listing priced 'on request' is not treated as a cheap one, it is simply kept.",
            "default": false
          },
          "minRooms": {
            "title": "Minimum rooms",
            "minimum": -1,
            "maximum": 30,
            "type": "integer",
            "description": "-1 turns the filter off. A listing without a room count is kept.",
            "default": -1
          },
          "maxRooms": {
            "title": "Maximum rooms",
            "minimum": -1,
            "maximum": 30,
            "type": "integer",
            "description": "-1 turns the filter off.",
            "default": -1
          },
          "minSizeSqm": {
            "title": "Minimum size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Living area for flats and houses, plot area for land - willhaben's main size figure. 0 means no minimum.",
            "default": 0
          },
          "maxSizeSqm": {
            "title": "Maximum size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 means no maximum.",
            "default": 0
          },
          "postcodes": {
            "title": "Postcodes",
            "type": "array",
            "description": "Keep only these 4-digit Austrian postcodes (1020, 5020 …).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "willhaben's German words, partial match: Wohnung, Dachgeschoßwohnung, Erdgeschoßwohnung, Maisonette, Penthouse, Einfamilienhaus, Reihenhaus, Villa, Baugrundstück …",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "advertiserType": {
            "title": "Advertiser",
            "enum": [
              "any",
              "agency",
              "private"
            ],
            "type": "string",
            "description": "Agency listings, or listings from private owners. Private owners are never named by willhaben.",
            "default": "any"
          },
          "outdoorSpaces": {
            "title": "Outdoor space",
            "type": "array",
            "description": "Keep only listings with one of these, as willhaben names them: Balkon, Terrasse, Garten, Loggia. A listing that publishes no outdoor space is kept.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeProjects": {
            "title": "Exclude new-build projects",
            "type": "boolean",
            "description": "Drop listings that belong to a development project.",
            "default": false
          },
          "publishedWithinDays": {
            "title": "Published within the last N days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "By willhaben's publish timestamp. 0 means no date filter. A listing whose date cannot be read is kept.",
            "default": 0
          },
          "monitoringMode": {
            "title": "Only return listings that are new since the last run",
            "type": "boolean",
            "description": "Turn this on and schedule the Actor: each run returns only the listings it has never returned before, so you are charged for new stock rather than for the same pages again. Listings that did not fit under the limit are still waiting for you on the next run.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was already returned",
            "type": "boolean",
            "description": "Clears the memory for this search, so the next monitoring run starts from scratch. Works with or without monitoring mode on.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}