Search homes to rent or buy in Belgium on Immoweb.
Searches Immoweb, Belgium's largest property portal, for apartments or houses to rent or for sale in a postcode: price (and monthly costs for rentals), bedrooms, living area, address, floor, energy label (EPC), agency, coordinates, a photo and the link. Filters by price, bedrooms and size; sort by relevance, newest or price. Paid premium positions are dropped by default. 60 results per page.
- Site
- Immoweb, Belgium
- Version
- v1
- Runs, last 7 days
- No reports yet
- sha256
- 1a8b5f97ebb0…
Run it with your agent
after installing WieldAsk in plain words. Your agent finds this recipe and calls it:
“Search homes to rent or buy in Belgium on Immoweb.”
Read-only: it changes nothing on the site. No login needed.
{ "tool": "run", "arguments": { "recipe_id": "immoweb.be/search-properties", "params": { "max_price": 1500, "min_bedrooms": 1, "postal_code": "1050" } } }
Requests
sent from your browser, in order- 1GET/en/search-results/{{f.type}}/{{f.tx}}?countries&maxPrice&minBedroomCount&minPrice&minSurface&orderBy&page&postalCodesImmoweb's own search-results JSON (/en/search-results/<type>/<for-rent|for-sale>, the data behind the list page) with the postcode as postalCodes, so no city slug is needed.
Parameters
from your agentReturns
to your agentWhere it can send
- www.immoweb.be
Anything else is blocked by the extension.
Reads from your session
Nothing. Your browser attaches the site's cookies by itself.
Used only in requests to the addresses on the left. Never sent to wield.run or your agent.
Checks
a run passes when- length(output.properties) > `20`
- output.total > `50`
- starts_with(output.area, 'Ixelles')
- length(output.properties[?price_eur > `1500`]) == `0`
- length(output.properties[?postal_code == '1050']) > `20`
- length(output.properties[?starts_with(url, 'https://www.immoweb.be/en/classified/')]) == length(output.properties)
- length(output.properties[?sponsored]) == `0`
Raw recipe
Served as canonical JSON from /api/v1/recipes/immoweb.be/search-properties, so its sha256 matches the ETag and the index.
curl -s https://wield.run/api/v1/recipes/immoweb.be/search-properties | shasum -a 256 # 1a8b5f97ebb08f2fc45a4211f9e70bf326390bea715bbcbe65320d6bd658c49e
{ "description": "Searches Immoweb, Belgium's largest property portal, for apartments or houses to rent or for sale in a postcode: price (and monthly costs for rentals), bedrooms, living area, address, floor, energy label (EPC), agency, coordinates, a photo and the link. Filters by price, bedrooms and size; sort by relevance, newest or price. Paid premium positions are dropped by default. 60 results per page.", "effect": "read", "id": "immoweb.be/search-properties", "keywords": [ "immoweb", "appartement", "maison", "à louer", "à vendre", "huren", "kopen", "appartement te huur", "property", "rent", "buy", "belgium", "brussels", "bruxelles", "antwerpen", "gent", "liège", "real estate" ], "output": { "schema": { "properties": { "area": { "description": "The area Immoweb matched, e.g. 'Ixelles (1050)'", "type": [ "string", "null" ] }, "page": { "type": "integer" }, "properties": { "items": { "properties": { "agency": { "type": [ "string", "null" ] }, "bedrooms": { "type": [ "integer", "null" ] }, "epc": { "description": "Energy label, e.g. 'C'", "type": [ "string", "null" ] }, "extra_costs_eur": { "description": "Monthly costs on top of the rent", "type": [ "number", "null" ] }, "floor": { "type": [ "integer", "null" ] }, "id": { "type": "string" }, "image": { "type": [ "string", "null" ] }, "latitude": { "type": [ "number", "null" ] }, "locality": { "type": [ "string", "null" ] }, "longitude": { "type": [ "number", "null" ] }, "new": { "type": "boolean" }, "postal_code": { "type": [ "string", "null" ] }, "price_eur": { "description": "Sale price, or monthly rent", "type": [ "number", "null" ] }, "price_text": { "type": [ "string", "null" ] }, "sponsored": { "description": "Paid premium position at the top", "type": "boolean" }, "status": { "description": "Immoweb's flag, e.g. 'new', 'under_option'", "type": [ "string", "null" ] }, "street": { "type": [ "string", "null" ] }, "surface_m2": { "type": [ "number", "null" ] }, "title": { "type": [ "string", "null" ] }, "type": { "type": [ "string", "null" ] }, "updated": { "type": [ "string", "null" ] }, "url": { "type": "string" } }, "type": "object" }, "type": "array" }, "total": { "type": [ "integer", "null" ] } }, "required": [ "properties" ], "type": "object" }, "value": "let $sp = params.include_sponsored == `true` in {total: steps.search[0].total || `0`, page: params.page || `1`, area: steps.search[0].area || `null`, properties: map(&(let $r = @ in let $l = $r.property.location in {id: to_string($r.id), title: $r.property.title || `null`, type: $r.property.subtype || $r.property.type || `null`, price_eur: $r.price.mainValue || `null`, extra_costs_eur: $r.price.additionalValue || `null`, price_text: $r.price.mainDisplayPrice || `null`, bedrooms: $r.property.bedroomCount || `null`, surface_m2: $r.property.netHabitableSurface || `null`, locality: $l.locality || `null`, postal_code: $l.postalCode || `null`, street: $l.street && join(' ', [$l.street, $l.number || '']) || `null`, floor: $l.floor || `null`, latitude: $l.latitude || `null`, longitude: $l.longitude || `null`, epc: $r.transaction.certificate || `null`, agency: $r.customerName || `null`, new: $r.flags.main == 'new', status: $r.flags.main || `null`, sponsored: $r.sourceProductType == 'PREMIUM_POSITION' || $r.advertisementId != `null`, updated: $r.publication.lastModificationDate || `null`, image: $r.media.pictures[0].largeUrl || `null`, url: join('', ['https://www.immoweb.be/en/classified/', to_string($r.id)])}), steps.search[0].results || `[]`)[?$sp || !sponsored]}" }, "params": { "additionalProperties": false, "properties": { "include_sponsored": { "default": false, "description": "Keep paid premium positions, marked sponsored", "type": "boolean" }, "max_price": { "description": "EUR (per month when renting)", "minimum": 0, "type": "integer" }, "min_bedrooms": { "maximum": 10, "minimum": 0, "type": "integer" }, "min_price": { "minimum": 0, "type": "integer" }, "min_surface": { "description": "m² living area", "minimum": 0, "type": "integer" }, "page": { "default": 1, "maximum": 30, "minimum": 1, "type": "integer" }, "postal_code": { "description": "Belgian postcode, e.g. '1000' (Brussels), '1050' (Ixelles), '2000' (Antwerpen), '9000' (Gent), '4000' (Liège)", "pattern": "^[1-9][0-9]{3}$", "type": "string" }, "property_type": { "default": "apartment", "enum": [ "apartment", "house" ], "type": "string" }, "sort": { "default": "relevance", "enum": [ "relevance", "newest", "cheapest", "most_expensive" ], "type": "string" }, "transaction": { "default": "rent", "enum": [ "rent", "buy" ], "type": "string" } }, "required": [ "postal_code" ], "type": "object" }, "provenance": { "method": "browser-inspect", "notes": "Immoweb's list pages /en/search/<type>/<transaction>/<city slug>/<postcode> canonicalise the city slug; their data comes from /en/search-results/<type>/<transaction>?countries=BE&postalCodes=<code>&… (JSON: totalItems, 60 results per page with property, location, price, transaction, publication, media). Passing the postcode as postalCodes avoids the slug entirely (criteria echoes 'Ixelles (1050)'). Filters minPrice, maxPrice, minBedroomCount, minSurface, orderBy and page are the page's own parameters. Links use /en/classified/<id>, which 301s to the canonical slug URL. When hasPremiumPosition is true, a paid premium position (sourceProductType PREMIUM_POSITION with an advertisementId) is put first, out of the requested order; it is marked sponsored and dropped by default. robots.txt has no rules for Claude-User or anthropic agents and allows /en/search-results. Answers servers (about 2 MB per page).", "recorded_at": "2026-11-07T22:33:00+01:00", "recorded_by": "C4" }, "requires_login": false, "schema": "https://wield.run/schema/recipe/v1.json", "site": { "country": "BE", "id": "immoweb.be", "language": "en", "name": "Immoweb", "origin": "https://www.immoweb.be", "origins": [ "https://www.immoweb.be" ] }, "steps": [ { "description": "Immoweb's own search-results JSON (/en/search-results/<type>/<for-rent|for-sale>, the data behind the list page) with the postcode as postalCodes, so no city slug is needed.", "expect": { "assert": "body.results != `null`", "content_type": "json", "status": [ 200 ] }, "extract": { "json": { "area": "criteria.postalCodes[0].label", "results": "results", "total": "totalItems" } }, "foreach": { "as": "f", "in": "[{type: params.property_type || 'apartment', tx: params.transaction == 'buy' && 'for-sale' || 'for-rent'}]", "max": 1 }, "id": "search", "request": { "headers": { "Accept": "application/json" }, "method": "GET", "query": { "countries": "BE", "maxPrice": "{{params.max_price}}", "minBedroomCount": "{{params.min_bedrooms}}", "minPrice": "{{params.min_price}}", "minSurface": "{{params.min_surface}}", "orderBy": "{{params.sort}}", "page": "{{params.page}}", "postalCodes": "{{params.postal_code}}" }, "url": "/en/search-results/{{f.type}}/{{f.tx}}" } } ], "task": "Search homes to rent or buy in Belgium on Immoweb", "tos": { "notes": "robots.txt has no AI-agent rules (no Claude-User, ClaudeBot or anthropic-ai group, no Content-Signal), checked 2026-11-07. Terms not reviewed yet for automated access. One person's search: 1 request for one results page. Contacting agencies stays on immoweb.be.", "reviewed": false }, "verify": { "checks": [ "length(output.properties) > `20`", "output.total > `50`", "starts_with(output.area, 'Ixelles')", "length(output.properties[?price_eur > `1500`]) == `0`", "length(output.properties[?postal_code == '1050']) > `20`", "length(output.properties[?starts_with(url, 'https://www.immoweb.be/en/classified/')]) == length(output.properties)", "length(output.properties[?sponsored]) == `0`" ], "example_params": { "max_price": 1500, "min_bedrooms": 1, "postal_code": "1050" }, "max_ms": 8000 }, "version": 1 }