API

Immoweb API: Belgische vastgoedzoekertjes als JSON

Een publieke API voor ontwikkelaars heeft Immoweb niet. Wat iedere bezoeker op immoweb.be te zien krijgt — vraagprijs, bewoonbare oppervlakte, slaapkamers, EPC-score, adres en immokantoor — komt hier terug als JSON, aan te spreken vanuit Python of eender welke andere taal. Immokantoren die hun eigen panden op Immoweb willen publiceren, zijn hier aan het verkeerde adres: er wordt niets geplaatst, alleen het aanbod gelezen dat op het moment van de aanvraag online staat.

Endpoints

endpointWat je terugkrijgtVerplicht
searchPanden te koop of te huur in heel België, of beperkt tot postcodes, districten, provincies of één immokantoor, met de filters van Immoweb zelf: prijs, slaapkamers, bewoonbare en grondoppervlakte, EPC, staat van het gebouw, bouwjaar, aantal gevels, tuin en terras. 30 zoekertjes per pagina.allemaal optioneel
property_detailHet volledige zoekertje op id of URL: prijs, oppervlaktes, EPC met primair energieverbruik, bouwjaar, kadastraal inkomen, verwarming, overstromingsgevoeligheid en stedenbouwkundige info, coördinaten, alle foto's en het immokantoor.property_id
market_countHoeveel panden aan een filtercombinatie voldoen, volgens de teller van Immoweb zelf. Zo zie je hoe groot een markt is, of volg je het aanbod in je gemeente op zonder één zoekertje binnen te halen.allemaal optioneel
location_searchZet een gemeente, postcode, provincie of kantoornaam om naar de exacte waarde die `search` verwacht. Werkt in het Nederlands, Frans en Engels ('Gent'/'Gand', 'Luik'/'Liège').query
agency_searchDe immokantoren per postcode, gerangschikt volgens hun aanbod: naam, adres, btw- en BIV-nummer, openingsuren en het aantal panden te koop en te huur.allemaal optioneel

Elke aanroep kost credits. Mislukte en geblokkeerde aanroepen zijn gratis.

Werkend voorbeeld

Twee rijen in dit antwoord vragen aandacht. De eerste is een betaalde plaatsing (`promoted: true`): Immoweb zet die bovenaan, los van de sortering, en ze duikt verderop op haar gewone plaats nog eens op. De tweede is een nieuwbouwproject zonder één vaste prijs: `price` is null en de vork staat in `project`. Wie een gemiddelde prijs per m² voor Gent wil berekenen, zet die twee eerst apart.

Verzoek
curl -X POST https://api.reefapi.com/immoweb/v1/search \
  -H "x-api-key: JOUW_SLEUTEL" \
  -H "content-type: application/json" \
  -d '{"transaction": "sale", "property_type": "house", "postal_codes": ["9000"], "language": "nl"}'
Antwoord (ingekort)
{
  "ok": true,
  "data": {
    "items": [
      {
        "property_id": 21934379,
        "promoted": true,
        "title": "Charmante gezinswoning met 4 slaapkamers en tuin",
        "price": 439000,
        "price_display": "€ 439.000",
        "price_type": "sale",
        "price_per_sqm": 2206.03,
        "bedrooms": 4,
        "surface_m2": 199,
        "land_surface_m2": 136,
        "epc_score": "B",
        "address": { "province": "Oost-Vlaanderen", "locality": "Gent", "postal_code": "9000", "street": "Drongensesteenweg" },
        "agency": { "name": "Convas" }
      },
      {
        "property_id": 21929749,
        "promoted": false,
        "property_type": "HOUSE_GROUP",
        "title": "Nieuwbouwwoningen Rhodon gelegen in de groene rand van Gent",
        "price": null,
        "price_display": "€ 495.000 - € 534.000",
        "price_type": "group_sale",
        "project": { "project_name": "Rhodon", "price_from": 495000, "price_to": 534000, "surface_range": "180 - 192", "sold_percentage": 42 }
      },
      ...
    ],
    "total_results": 446,
    "promoted_count": 1,
    "filters_applied": { "transaction": "sale", "property_type": "HOUSE", "postal_codes": "BE-9000", "sort": "relevance" },
    "filters_ignored": []
  },
  "meta": { "record_count": 30, "cache_hit": false, "mode": "live", "language": "nl" }
}

Zelf een Immoweb-scraper schrijven?

Het verraderlijke aan Immoweb is dat een fout er niet uitziet als een fout. Geef je een filterwaarde mee die de site niet kent, dan antwoordt ze met HTTP 200 en de volledige, ongefilterde markt. Zelfs een netjes gecodeerde komma of plus in de EPC-filter (`A%2CB`, `A%2B`) wordt zo stilzwijgend genegeerd: je script denkt dat het EPC A en B ophaalt en krijgt alle huizen van het land.

Wij vergelijken bij elke zoekopdracht wat we gevraagd hebben met de filters die Immoweb zelf als toegepast terugmeldt (`filters_applied`). Valt er één weg, dan krijg je een fout met de naam van die filter, en geen lijst die gefilterd lijkt zonder het te zijn.

Verder is pagina 333 (zo'n 9.990 zoekertjes) de laatste: wie verder bladert, krijgt een serverfout. En wie in een taal vraagt die de adverteerder niet gebruikt heeft, krijgt een lege titel en beschrijving terug. Beide vangen we op. Wie één keer de huizen van één gemeente wil binnenhalen, is met een eigen script goedkoper af; moet de opvolging elke week draaien, dan zit de kost in het tijdig opmerken van zulke stille fouten.

Grenzen en eerlijke kanttekeningen

  • Dit is niet de officiële Immoweb-API en we hebben geen samenwerking met Immoweb.
  • Immoweb publiceert geen verkoopprijzen van verkochte panden: je krijgt vraagprijzen, geen transactieprijzen.
  • Per zoekopdracht zijn hoogstens 333 pagina's (ongeveer 9.990 zoekertjes) bereikbaar. `total_results` geeft het echte totaal; is dat groter, splits dan op per postcode of provincie.
  • Niet elk getal is een vraagprijs. Bij nieuwbouwprojecten en lijfrentes is `price` null (de prijsvork staat in `project`, het boeket en de rente in `price_details`); bij een openbare verkoop is `price` de instelprijs. Kijk daarom altijd naar `price_type`.
  • `price_per_sqm` in de resultatenlijst rekenen wij zelf uit op basis van prijs en bewoonbare oppervlakte; Immoweb toont dat getal daar niet. Ontbreekt een van beide, dan is het veld null.