Wie krijgt toegang
De API hoort bij elk makelaarspakket: Basis, Pro en Enterprise. Er is geen aparte API-toeslag.
Zonder actief pakket kun je wel al aanleveren en testen: objecten worden dan als concept opgeslagen en staan niet online. Na activatie zet de eerstvolgende aanroep voor een object het online. Bekijk tarieven →
API-sleutel aanmaken
De eigenaar van een vestiging maakt de sleutel aan in het makelaarsdashboard (/mijn/bestel-platform/). Een sleutel ziet er zo uit:
qmg_mkl_3f9a0c1d2e4b5a6978c0d1e2f3a4b5c6d7e8f901
- Vestigingssleutel (standaard): geldt voor één vestiging.
- Organisatiesleutel: alleen voor de eigenaar van de organisatie, geldt voor alle vestigingen. Stuur dan per object
vestiging_idmee.
De sleutel is maar één keer zichtbaar; wij bewaren alleen een hash. Kwijt? Trek hem in en maak een nieuwe. Maximaal 5 actieve sleutels per vestiging. Is de maker van een sleutel geen eigenaar meer van de vestiging, dan werkt de sleutel niet meer.
Authenticatie
Stuur de sleutel bij elk verzoek mee in één van deze headers:
Authorization: Bearer qmg_mkl_... # of X-API-Key: qmg_mkl_...
Endpoints
Alle endpoints onder https://questmediagroup.eu/api/v1/.
| Method | Path | Doel |
|---|---|---|
GET | /properties | Lijst eigen objecten (limit max 200, offset, status, vestiging_id, gewijzigd_sinds, alleen_api=1) |
GET | /properties/{external_id} | Eén object op je eigen objectnummer (of op ons id) |
POST | /properties | Aanmaken of bijwerken op external_id uit de body |
PUT | /properties/{external_id} | Aanmaken of bijwerken; weggelaten velden blijven ongewijzigd |
DELETE | /properties/{external_id} | Intrekken (status ingetrokken, niet meer online) |
POST | /properties/bulk | Tot 100 objecten per aanroep |
In het pad passen alleen letters, cijfers, _ en -. Bevat je objectnummer een punt, gebruik dan ?external_id=… op /properties.
Velden
Onbekende velden geven een fout, zodat tikfouten niet ongemerkt blijven. Bij bijwerken pas je alleen de velden aan die je meestuurt; null maakt een optioneel veld leeg.
| Veld | Type | Toelichting |
|---|---|---|
external_id | tekst | Verplicht. Je eigen objectnummer, 1 tot 100 tekens (letters, cijfers, ., _, -). Uniek per vestiging; wijzigt niet. |
vestiging_id | uuid | Alleen bij een organisatiesleutel; anders de vestiging van de sleutel. |
title | tekst | Max 200. Verplicht bij nieuw, of address. |
deal_type | koop | huur | Verplicht bij nieuw. Huurprijzen gelden per maand. |
object_type | keuze | woning, appartement, winkel, bedrijfspand, kantoor, horeca, grond, parkeren, overig. Standaard woning. |
audience | b2c | b2b | b2g | Standaard b2c. |
price_cents | geheel getal | Vraagprijs of huurprijs in centen (€ 350.000 = 35000000). Verplicht bij nieuw, tenzij price_on_request. |
price_on_request | true | false | Prijs op aanvraag. |
address | tekst | Straat en huisnummer, max 200. |
postcode | tekst | 1234 AB (Nederland) of 1234 (België). |
city | tekst | Verplicht bij nieuw, max 80. |
wijk | tekst | Optioneel, max 80. |
lat, lng | getallen | Optioneel, samen, binnen Nederland of België. Laat je ze weg, dan zoeken wij de coördinaten op bij PDOK (alleen Nederlandse adressen met address, postcode en city, en alleen als de gevonden postcode klopt). Een ongewijzigd adres wordt niet opnieuw opgezocht. |
rooms, bedrooms | geheel getal | Aantal kamers en slaapkamers. |
living_area_m2 | geheel getal | Woon- of gebruiksoppervlakte in m². |
plot_area_m2 | geheel getal | Perceeloppervlakte in m². |
construction_year | geheel getal | Bouwjaar. |
energy_label | keuze | A++++ t/m G. |
description | tekst | Platte tekst, max 20.000 tekens (HTML-tags worden verwijderd). |
status | keuze | beschikbaar, onder_bod, verkocht, verhuurd, ingetrokken. Standaard beschikbaar; weggelaten bij bijwerken = laatst gestuurde status. |
photos | lijst URL's | Max 30, eerste is de hoofdfoto. Zie §08. |
source_url | URL | Pagina van het object op je eigen site. Hebben wij dit object al van je website overgenomen als voorvertoning, dan wordt die voorvertoning gekoppeld aan je external_id in plaats van een tweede object aan te maken (response: overgenomen_uit_website_import: true). |
Publiceren, pakket en maximum
- Zonder actief pakket wordt een object opgeslagen als
concept. De response bevat danmeldingmet uitleg. Objecten die al online staan blijven online en kun je gewoon bijwerken. - Maximum per vestiging. Geldt er voor je pakket een maximum aantal actieve objecten (
beschikbaarenonder_bod) per vestiging, dan werkt de API precies zoals het dashboard: kom je erboven, dan gaat je pakket per de volgende factuur automatisch een niveau omhoog, krijg je daarover een mail en staat het object meteen online. De response bevat danupgrade. - Boven het hoogste niveau (1.000 actieve objecten voor één vestiging) antwoordt de API met
409 objecten_max. Je gegevens zijn dan wel opgeslagen, maar het object staat niet online. Verdeel je aanbod over vestigingen of haal eerst een object offline. verkochtenverhuurdblijven zichtbaar maar tellen niet mee voor het maximum.ingetrokkenhaalt het object offline.
POST /properties: aanmaken of bijwerken
curl -X POST https://questmediagroup.eu/api/v1/properties \
-H "Authorization: Bearer qmg_mkl_..." \
-H "Content-Type: application/json" \
-d '{
"external_id": "OBJ-2026-0412",
"title": "Ruime eengezinswoning met tuin",
"deal_type": "koop",
"object_type": "woning",
"price_cents": 42500000,
"address": "Voorbeeldstraat 12",
"postcode": "3011 AB",
"city": "Rotterdam",
"rooms": 5,
"bedrooms": 3,
"living_area_m2": 128,
"plot_area_m2": 160,
"energy_label": "A",
"status": "beschikbaar",
"description": "Eigen omschrijving uit je systeem.",
"photos": [
"https://jouwkantoor.nl/media/obj-2026-0412/1.jpg",
"https://jouwkantoor.nl/media/obj-2026-0412/2.jpg"
],
"source_url": "https://jouwkantoor.nl/aanbod/voorbeeldstraat-12/"
}'Response (201 bij aanmaken, 200 bij bijwerken):
{
"ok": true,
"actie": "aangemaakt",
"object": {
"id": "5b0c2d1e-...",
"external_id": "OBJ-2026-0412",
"status": "beschikbaar",
"gepubliceerd": true,
"url": "https://allesoverpanden.nl/pand/ruime-eengezinswoning-met-tuin-rotterdam-3fa1c/",
"photos": ["https://.../property-media/.../api-....jpg", "..."],
"...": "..."
},
"fotos": { "opgeslagen": 2, "nieuw": 2, "wachtend": [], "fouten": [] }
}Alleen een status bijwerken kan met één veld:
curl -X PUT https://questmediagroup.eu/api/v1/properties/OBJ-2026-0412 \
-H "X-API-Key: qmg_mkl_..." -H "Content-Type: application/json" \
-d '{ "status": "onder_bod" }'Foto's
- Stuur openbare http(s)-URL's. Wij downloaden ze en bewaren een eigen kopie; je server hoeft ze daarna niet meer te leveren.
- Toegestaan: JPEG, PNG en WebP, maximaal 15 MB per foto, kortste zijde minimaal 200 pixels. Maximaal 30 foto's per object.
- Stuur je
photosmee, dan wordt de fotoset van het object precies die lijst (volgorde = volgorde op de pagina). Laat je het veld weg, dan blijven de foto's ongewijzigd.[]verwijdert alle via de API geleverde foto's. - Ongewijzigde URL's worden niet opnieuw gedownload. Gebruik dus een nieuwe URL als een foto verandert.
- Downloaden heeft per aanroep een tijdslimiet. Wat niet meer past staat in
fotos.wachtenden komt bij de volgende aanroep voor dat object mee. Foto's die niet te verwerken zijn staan met reden infotos.fouten. - Foto's die je zelf in het dashboard uploadt, blijven staan.
POST /properties/bulk: tot 100 objecten
Elk object wordt verwerkt zoals bij POST /properties; een fout object houdt de rest niet tegen. Dezelfde external_id mag maar één keer per aanroep voorkomen.
curl -X POST https://questmediagroup.eu/api/v1/properties/bulk \
-H "Authorization: Bearer qmg_mkl_..." \
-H "Content-Type: application/json" \
-d '{ "objecten": [
{ "external_id": "OBJ-1", "title": "...", "deal_type": "koop", "city": "Rotterdam", "price_cents": 31500000 },
{ "external_id": "OBJ-2", "status": "verkocht" }
] }'{
"ok": false,
"verwerkt": 2, "aangemaakt": 1, "bijgewerkt": 0, "concept": 0, "geweigerd": 0, "fouten": 1,
"resultaten": [
{ "index": 0, "external_id": "OBJ-1", "http": 201, "id": "...", "status": "beschikbaar", "gepubliceerd": true, "url": "..." },
{ "index": 1, "external_id": "OBJ-2", "http": 400, "error": "validatie_mislukt",
"fouten": [ { "veld": "deal_type", "melding": "Verplicht bij een nieuw object (koop of huur)." } ] }
]
}Ophalen en intrekken
# alles wat sinds 1 november is gewijzigd curl "https://questmediagroup.eu/api/v1/properties?gewijzigd_sinds=2026-11-01T00:00:00Z&limit=200" \ -H "X-API-Key: qmg_mkl_..." # één object curl https://questmediagroup.eu/api/v1/properties/OBJ-2026-0412 -H "X-API-Key: qmg_mkl_..." # intrekken curl -X DELETE https://questmediagroup.eu/api/v1/properties/OBJ-2026-0412 -H "X-API-Key: qmg_mkl_..."
De lijst bevat ook objecten die je in het dashboard hebt aangemaakt (die hebben external_id: null; filter met alleen_api=1). Is next_offset gevuld, dan is er nog een pagina. Een ingetrokken object zet je weer online door het opnieuw met status: "beschikbaar" te sturen.
Fouten en limieten
| Code | Betekenis |
|---|---|
| 200 / 201 | Bijgewerkt / aangemaakt (kijk naar object.status en melding: zonder pakket is dat concept) |
| 400 | validatie_mislukt met per veld een fouten-lijst, of ongeldige_json, vestiging_id_vereist, external_id_wijkt_af |
| 401 | sleutel_ontbreekt, sleutel_ongeldig of sleutel_niet_meer_geldig |
| 403 | vestiging_niet_toegestaan: de sleutel geldt niet voor deze vestiging |
| 404 | niet_gevonden |
| 409 | objecten_max (maximum per vestiging bereikt, gegevens wel opgeslagen) of external_id_bestaat_al |
| 413 | Meer dan 100 objecten per bulk-aanroep, of te grote body |
| 429 | te_veel_verzoeken: maximaal 1.000 verzoeken per uur per sleutel |
| 5xx | Tijdelijke fout: probeer opnieuw met oplopende wachttijd. Aanroepen zijn veilig te herhalen. |
Elke fout heeft een vaste code in error en een Nederlandse uitleg in message of fouten. De API stuurt zelf geen webhooks of verzoeken naar je systeem; alleen de foto's die je opgeeft worden opgehaald.
Support
Vragen over de koppeling: api@questmediagroup.eu.
Recruiters vinden hun eigen API op /api-docs/recruiters/.
Quest Media Group · KvK 82781486 · BTW NL862602282B01 · Zwanebloem 47, 2408 LT Alphen aan den Rijn