{
  "openapi": "3.0.1",
  "info": {
    "title": "Immoweb Scraper | Belgium Property Listings & EUR per m2",
    "description": "Belgian property listings from Immoweb with price per square metre computed, multi-unit developments and life-annuity sales flagged so they never distort a comparable, and median EUR/m2 by postcode. Search by postcode, price, bedrooms, surface and property subtype.",
    "version": "1.0",
    "x-build-id": "jKgdomyx9ULAVa6vL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alinz~immoweb-belgium-property/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alinz-immoweb-belgium-property",
        "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/alinz~immoweb-belgium-property/runs": {
      "post": {
        "operationId": "runs-sync-alinz-immoweb-belgium-property",
        "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/alinz~immoweb-belgium-property/run-sync": {
      "post": {
        "operationId": "run-sync-alinz-immoweb-belgium-property",
        "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",
        "required": [
          "propertyType",
          "transaction"
        ],
        "properties": {
          "searchUrlInput": {
            "title": "Paste an Immoweb search URL",
            "type": "string",
            "description": "Easiest way in: run the search you want on immoweb.be, then copy the address bar and paste it here. It sets the property type, market and postcodes for you, and the three fields below are ignored. Note that Immoweb ignores province and district filters when a page is fetched directly - only postcodes filter reliably - so if your URL uses them the run will say so rather than quietly returning all of Belgium."
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "house-and-apartment",
              "house",
              "apartment",
              "land",
              "garage",
              "office",
              "business"
            ],
            "type": "string",
            "description": "Which listing category to crawl.",
            "default": "house-and-apartment"
          },
          "transaction": {
            "title": "Sale or rent",
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "Whether to crawl properties for sale or for rent.",
            "default": "sale"
          },
          "postalCodes": {
            "title": "Belgian postcodes",
            "type": "array",
            "description": "Optional. 1000 = central Brussels, 1050 = Ixelles, 1180 = Uccle, 2000 = Antwerp, 9000 = Ghent, 8000 = Bruges. Leave empty to crawl all of Belgium.",
            "items": {
              "type": "string"
            }
          },
          "maxPages": {
            "title": "Pages to crawl",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "30 listings per page. Pages are fetched sequentially with a pause between them, so this is the main driver of run time.",
            "default": 5
          },
          "minPrice": {
            "title": "Minimum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Applied after fetching. Immoweb's robots.txt disallows price parameters in URLs, so this Actor filters locally instead of asking the site to filter."
          },
          "maxPrice": {
            "title": "Maximum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Applied after fetching, for the same robots.txt reason as the minimum."
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Applied after fetching. Listings with no bedroom count are excluded when this is set."
          },
          "minSurface": {
            "title": "Minimum habitable surface (m2)",
            "minimum": 0,
            "type": "integer",
            "description": "Applied after fetching. Listings with no recorded surface are excluded when this is set."
          },
          "maxPricePerSqm": {
            "title": "Maximum EUR per m2",
            "minimum": 0,
            "type": "integer",
            "description": "Screen for value: only listings at or below this rate. Computed by this Actor, since Immoweb leaves the field empty."
          },
          "standardSalesOnly": {
            "title": "Comparable sales only",
            "type": "boolean",
            "description": "Excludes multi-unit developments, life annuities (viager), public sales and starting-price listings. Their headline prices are not comparable to ordinary sales and will distort any average.",
            "default": true
          },
          "subtypes": {
            "title": "Property subtypes",
            "type": "array",
            "description": "Optional. Filter to specific subtypes, e.g. VILLA, PENTHOUSE, DUPLEX, FLAT_STUDIO, TOWN_HOUSE, MANSION, EXCEPTIONAL_PROPERTY.",
            "items": {
              "type": "string"
            }
          },
          "outputFormat": {
            "title": "Output",
            "enum": [
              "listings",
              "stats"
            ],
            "type": "string",
            "description": "Statistics group by postcode rather than town name, because one Belgian town appears under French, Dutch and English spellings at once.",
            "default": "listings"
          },
          "minListingsPerGroup": {
            "title": "Minimum listings per statistic",
            "minimum": 1,
            "type": "integer",
            "description": "Statistics mode only. Groups smaller than this are dropped, since a median over two listings is noise.",
            "default": 5
          },
          "maxResults": {
            "title": "Max rows",
            "minimum": 1,
            "type": "integer",
            "description": "Optional cap on rows returned. Useful for a cheap trial run."
          },
          "delayMs": {
            "title": "Delay between pages (ms)",
            "minimum": 1000,
            "maximum": 15000,
            "type": "integer",
            "description": "Immoweb runs bot protection. This Actor crawls politely rather than trying to evade it; raise this if the site starts serving challenges.",
            "default": 2500
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}