{
  "openapi": "3.0.1",
  "info": {
    "title": "Immoweb Scraper - Belgium Property Listings & Prices",
    "description": "Scrape Immoweb.be listings across Belgium: price, EPC label, surface, bedrooms, GPS, photos and agency contacts. Sale and rental, every property type.",
    "version": "1.0",
    "x-build-id": "bVfFUiv55mda4lMxW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~immoweb-be-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-immoweb-be-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~immoweb-be-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-immoweb-be-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~immoweb-be-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-immoweb-be-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 Belgian location and filter set; Property Detail takes Immoweb listing URLs or IDs and returns the description, EPC certificate, cadastral income and agency contact details.",
            "default": "search"
          },
          "locations": {
            "title": "📍 Locations",
            "type": "array",
            "description": "Where to search. Give city or district names (Brussels, Ghent, Antwerp, Liège, Bruges), 4-digit postal codes (1000, 9000, 2000), or province names. Each entry is resolved against Immoweb's own location index, so you do not need its internal codes. Leave the list empty to search the whole of Belgium.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "propertyType": {
            "title": "🏠 Property type",
            "enum": [
              "house",
              "apartment",
              "house-and-apartment",
              "villa",
              "apartment-block",
              "land",
              "garage",
              "office",
              "business",
              "industry",
              "new-real-estate-project-houses",
              "new-real-estate-project-apartments"
            ],
            "type": "string",
            "description": "Which Immoweb section to search. 'Houses and apartments' covers both residential types in one run, which is what most market studies want.",
            "default": "house"
          },
          "transactionType": {
            "title": "🤝 For sale or for rent",
            "enum": [
              "for-sale",
              "for-rent"
            ],
            "type": "string",
            "description": "Sale listings carry an asking price; rental listings carry a monthly rent and, where the agency published it, the charges on top.",
            "default": "for-sale"
          },
          "maxResults": {
            "title": "🔢 Max listings",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Stop after this many listings across every location in the run. One call returns 30 listings, so the run finishes at the first call that crosses your limit.",
            "default": 100
          },
          "sort": {
            "title": "↕️ Sort by",
            "enum": [
              "newest",
              "relevance",
              "cheapest",
              "most_expensive",
              "postal_code"
            ],
            "type": "string",
            "description": "Newest first is what you want when you run this on a schedule and only care about what appeared since the last run.",
            "default": "newest"
          },
          "language": {
            "title": "🗣️ Listing language",
            "enum": [
              "en",
              "nl",
              "fr"
            ],
            "type": "string",
            "description": "Immoweb serves the same listings in three languages. This sets the language of the labels and the formatted price text; agent-written descriptions come back in whatever language the agency typed them.",
            "default": "en"
          },
          "includeDetails": {
            "title": "📄 Add full details",
            "type": "boolean",
            "description": "Fetch each listing's own record to add the full description, EPC score and consumption, cadastral income, construction year, condition, and the agency's phone, email and website. Costs one extra request per listing and bills the Property Detail event on top of the listing row.",
            "default": false
          },
          "minPrice": {
            "title": "💵 Min price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest price to include, in euros. 0 means no lower bound. For rentals this is a monthly rent.",
            "default": 0
          },
          "maxPrice": {
            "title": "💰 Max price (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest price to include, in euros. 0 means no upper bound. Pairing this with a min price is also how you split a search that would otherwise exceed Immoweb's 9,990-result ceiling.",
            "default": 0
          },
          "minBedroomCount": {
            "title": "🛏️ Min bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Only listings with at least this many bedrooms. 0 means no minimum.",
            "default": 0
          },
          "minSurface": {
            "title": "📐 Min living area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum net habitable surface in square metres. 0 means no minimum.",
            "default": 0
          },
          "minLandSurface": {
            "title": "🌳 Min plot size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum land surface in square metres. Useful for houses and building land; apartments rarely carry it.",
            "default": 0
          },
          "epcScores": {
            "title": "⚡ Energy label",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only listings carrying one of these EPC labels. Leave it empty to return every label. Belgian renovation obligations bite at E, F and G, which is where renovation buyers look.",
            "items": {
              "type": "string",
              "enum": [
                "A++",
                "A+",
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G"
              ],
              "enumTitles": [
                "🟢 A++ (best)",
                "🟢 A+",
                "🟢 A",
                "🟩 B",
                "🟨 C",
                "🟧 D",
                "🟥 E",
                "🟥 F",
                "⬛ G (worst)"
              ]
            },
            "default": []
          },
          "buildingCondition": {
            "title": "🔨 Condition",
            "enum": [
              "any",
              "AS_NEW",
              "JUST_RENOVATED",
              "GOOD",
              "TO_BE_DONE_UP",
              "TO_RENOVATE",
              "TO_RESTORE"
            ],
            "type": "string",
            "description": "Immoweb's own condition grading, as the agency filled it in. 'To renovate' and 'To restore' are the two that flag a project property.",
            "default": "any"
          },
          "hasGarden": {
            "title": "🌿 Only with a garden",
            "type": "boolean",
            "description": "Skip listings with no garden.",
            "default": false
          },
          "hasTerrace": {
            "title": "🪴 Only with a terrace",
            "type": "boolean",
            "description": "Skip listings with no terrace.",
            "default": false
          },
          "hasSwimmingPool": {
            "title": "🏊 Only with a pool",
            "type": "boolean",
            "description": "Skip listings with no swimming pool.",
            "default": false
          },
          "isNewlyBuilt": {
            "title": "🆕 Only new builds",
            "type": "boolean",
            "description": "Only newly built properties, which on Immoweb also means the ones sold under VAT rather than registration duty.",
            "default": false
          },
          "searchUrls": {
            "title": "🌐 Search URLs",
            "type": "array",
            "description": "Paste Immoweb search URLs instead of filling the fields above. Build the search on immoweb.be, copy the address bar, and every filter in it is read straight off the URL — including facets this form does not expose.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "listingUrls": {
            "title": "🏠 Listing URLs",
            "type": "array",
            "description": "Used by the Property Detail operation: Immoweb listing URLs to expand, e.g. https://www.immoweb.be/en/classified/house/for-sale/oosterzele/9860/21798321. A bare listing ID such as 21798321 works too.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}