{
  "openapi": "3.0.1",
  "info": {
    "title": "Immoweb Property Scraper (Belgium)",
    "description": "Scrapes houses, apartments, land and commercial property from Immoweb — Belgium's #1 real-estate portal. Filter by type, postal code, price and bedrooms; returns price, address, surface, energy certificate, amenities, photos and agency contact for every listing.",
    "version": "0.1",
    "x-build-id": "DAcG1ld4hTUJdlseC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapyx~immoweb-properties-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapyx-immoweb-properties-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/scrapyx~immoweb-properties-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapyx-immoweb-properties-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/scrapyx~immoweb-properties-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapyx-immoweb-properties-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": {
          "propertyType": {
            "title": "Property type",
            "enum": [
              "house",
              "apartment",
              "house-and-apartment",
              "land",
              "office",
              "garage",
              "business",
              "commercial",
              "industry",
              "warehouse",
              "villa",
              "bungalow",
              "chalet",
              "castle",
              "farmhouse",
              "town-house",
              "mansion",
              "apartment-block",
              "mixed-use-building",
              "penthouse",
              "loft",
              "duplex",
              "triplex",
              "ground-floor",
              "service-flat",
              "kot"
            ],
            "type": "string",
            "description": "Which kind of property to search. Only the values in this list are real Immoweb path segments — an unrecognised one is answered with HTTP 200 and silently returns the unfiltered house/for-sale results, so anything else is refused rather than run. Subtypes (villa, castle, penthouse…) narrow within their parent type.",
            "default": "house"
          },
          "transactionType": {
            "title": "For sale or for rent",
            "enum": [
              "for-sale",
              "for-rent"
            ],
            "type": "string",
            "description": "Only these two transaction states are reachable through Immoweb's public search. 'sold' and 'rented' archives are not exposed.",
            "default": "for-sale"
          },
          "country": {
            "title": "Country",
            "enum": [
              "BE",
              "FR",
              "NL",
              "LU",
              "ES",
              "IT"
            ],
            "type": "string",
            "description": "Immoweb is a Belgian portal but also lists foreign property. Belgium is where the inventory actually is (≈48k houses for sale); the others are thin.",
            "default": "BE"
          },
          "postalCodes": {
            "title": "Postal codes",
            "type": "array",
            "description": "Belgian postal codes to restrict the search to, e.g. 1000 (Brussels City), 2000 (Antwerp), 9000 (Ghent), 4000 (Liège). Leave empty for the whole country. Every code is checked against what Immoweb reports back as actually applied — an unrecognised code is reported on the SEARCH_SUMMARY row as `filtersIgnored` instead of silently returning nationwide results.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty or 0 for no minimum.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty or 0 for no maximum.",
            "default": 0
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty or 0 for any.",
            "default": 0
          },
          "maxBedrooms": {
            "title": "Maximum bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty or 0 for any.",
            "default": 0
          },
          "minLandSurface": {
            "title": "Minimum land surface (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave empty or 0 for any. Applies to the plot, not the habitable area.",
            "default": 0
          },
          "orderBy": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "newest",
              "cheapest",
              "most_expensive",
              "postal_code",
              "surface"
            ],
            "type": "string",
            "description": "How Immoweb should order the results before pagination.",
            "default": "relevance"
          },
          "classifiedUrls": {
            "title": "Classified URLs (direct mode)",
            "type": "array",
            "description": "Scrape specific listings directly, skipping search. Accepts a full URL (https://www.immoweb.be/en/classified/21761641) or a bare numeric id. Can be combined with a search in the same run.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max properties per search",
            "minimum": 0,
            "type": "integer",
            "description": "Stop paginating after this many properties. Set to 0 for unlimited — note that Immoweb itself serves at most 9,990 results per query (333 pages × 30) no matter how many matches exist, so unlimited means 'up to 9,990'. Narrow by postal code or price to reach the rest.",
            "default": 100
          },
          "includePropertyDetails": {
            "title": "Fetch full property details",
            "type": "boolean",
            "description": "Fetch the complete listing (full description, every amenity flag, energy certificate, floor plans, legal documents, agency contact) for each result via one extra request per property. Turn this off for a fast listing-only crawl — search rows already carry price, address, surface, bedrooms, photos and the agency name.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Upper bound on requests in flight at once, across both search pagination and detail fetches. Immoweb is not rate-limit sensitive at these levels, but keep it modest to stay a good citizen.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Immoweb runs no active bot challenge and a direct connection works, but Residential is the default for cloud runs — datacenter egress from the Apify container is a different posture than a local ISP connection, and this portfolio has already lost a full cloud run to that difference once.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}