Website configurator → offertetool Voordeel Dakopbouw
Hoe een aanvraag uit de configurator rechtstreeks bij ons binnenkomt, en hoe je met onze actuele prijzen kunt rekenen.
Zo werkt het
- De klant stelt zijn dakopbouw samen in de configurator en drukt op offerte aanvragen.
- Jullie server stuurt het JSON van de configuratie naar ons endpoint (hieronder), met de API-sleutel.
- Wij antwoorden direct met
201en het id van de aanvraag. Daarmee staat hij in onze database en bij Aanvragen & inzendingen in de offertetool; wij nemen contact op met de klant. - Jullie tonen je eigen bedankpagina. Die hoeft niets naar ons te linken of door te sturen: met het antwoord
ok: trueweet je dat de aanvraag binnen is.
Geen e-mail en geen klantgegevens bewaren. De aanvraag gaat rechtstreeks naar ons. Jullie hoeven niets op te slaan: niet van de klant en niet van de aanvraag.
Verbinding
POST https://kantoor.voordeeldakopbouw.nl/api/extern/rekentool/aanvragen
Prijs opvragenPOST https://kantoor.voordeeldakopbouw.nl/api/extern/rekentool/prijs
ProefGET https://kantoor.voordeeldakopbouw.nl/api/extern/rekentool/ping
HeadersContent-Type: application/json
Authorization: Bearer <API-sleutel>
De API-sleutel krijg je apart van ons. Gebruik hem alleen op de server, nooit in JavaScript in de browser. Ook X-Api-Key: <sleutel> werkt. De proef schrijft niets weg en vertelt of de sleutel klopt en de koppeling aanstaat.
Wat je meestuurt
Het JSON van de configurator mag precies zo blijven als het nu is. Je hoeft geen standaardwaarden eruit te halen; weergave-instellingen zoals exploded_view en wireframe_view negeren we. Wij herkennen het formaat aan width en depth bovenin. Maten in centimeters, inclination_front/inclination_back als hoek met de vloer (90 = recht).
Zet er bovenin drie dingen bij:
| Veld | Uitleg |
|---|---|
request_id | Aanbevolen. Jullie eigen, unieke id van de aanvraag. Nogmaals insturen met hetzelfde id werkt de aanvraag bij in plaats van een tweede te maken. Zonder id leiden wij er een af van de inhoud. |
reference | Als de configurator via onze link is geopend (…/configurator?ref=…). Wij geven de referentie bij het laden mee via set-inputs in een veld reference; stuur hem ongewijzigd terug. Dan hangt de aanvraag meteen aan de juiste klant bij ons en zijn naam en adres hoeven niet mee. Een aangepaste of verzonnen referentie wordt genegeerd. |
customer | Zonder referentie (een gewone bezoeker van de website): de contactgegevens die de klant invult, zodat wij hem kunnen bereiken. firstname, lastname, email, phone, address, zip, city. Een e-mailadres of telefoonnummer is dan verplicht. Alleen doorsturen, niet bewaren. |
remark | Optioneel: een opmerking van de klant. |
Voorbeeld
{
"request_id": "PH-2026-000123",
"reference": "k_…",
"customer": {
"firstname": "Jan", "lastname": "Jansen",
"email": "jan@example.nl", "phone": "0612345678",
"address": "Dorpsstraat 12", "zip": "2011AB", "city": "Haarlem"
},
"width": 500.0,
"depth": 800.0,
"height": 500.0,
"inclination_front": 70.0,
"inclination_back": 90.0,
"walls_presence": ["Right", "Left", "Front", "Back", "Floor"],
"stairs_measurement_from": "front",
"stairs_y": 50.0, "stairs_x": 187.5, "stairs_width": 125.0, "stairs_length": 125.0,
"side_wall_left_material": "grijs_keralit",
"neighbour_left_type": "none",
"side_wall_right_material": "grijs_keralit",
"neighbour_right_type": "none",
"front_wall_material": "bricks_01",
"front_wall_array": [
{
"front_opening_type": true,
"front_opening_frames": 3,
"front_opening_frames_tilted": [1, 0, 1],
"front_opening_frames_ventilation": [0, 0, 0],
"front_opening_x": 62.5, "front_opening_z": 90.0,
"front_opening_width": 250.0, "front_opening_height": 285.0
}
],
"back_wall_material": "bricks_01",
"back_wall_array": [],
"transport_module_size": 300.0,
"floor_insulation": true,
"roof_window": false
}
Geef je óf reference óf customer mee, niet per se allebei. Materiaal- en optiecodes (grijs_keralit, bricks_01 …) koppelen wij één keer aan onze eigen opbouw. Houd ze daarom vast; komen er nieuwe bij, dan zien wij dat vanzelf.
Insturen
curl -X POST 'https://kantoor.voordeeldakopbouw.nl/api/extern/rekentool/aanvragen' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <API-sleutel>' \
-d @aanvraag.json
Antwoord
HTTP/1.1 201 Created
{
"ok": true,
"id": "cm…", // onze aanvraag
"aanvraagId": "PH-2026-000123", // jullie request_id
"resultaat": "aangemaakt", // of "bijgewerkt"
"formaat": "packhunt",
"klantGekoppeld": true, // de reference wees naar een klant
"waarschuwingen": []
}
| Status | Betekenis |
|---|---|
201 | Aangemaakt. Toon de bedankpagina. |
200 | Bijgewerkt: dit request_id was al binnen. |
400 | Geen geldige JSON. |
401 | API-sleutel ontbreekt of klopt niet. |
413 | Groter dan 256 KB. |
422 | De aanvraag klopt niet, bijvoorbeeld geen referentie en geen e-mail/telefoon. In fouten staat per veld wat er mis is. |
429 | Te veel verzoeken; wacht het aantal seconden uit de Retry-After-header. |
503 | De koppeling staat bij ons tijdelijk uit. |
Mislukt het (5xx of time-out)? Probeer het later opnieuw met hetzelfde request_id; dubbel insturen kan geen kwaad. Laat de klant in dat geval niet met een foutmelding zitten: de bedankpagina mag gewoon getoond worden.
Prijs opvragen
In plaats van een prijzenbestand bij jullie kun je de prijs live bij ons opvragen: dezelfde sleutel, dezelfde JSON (klantgegevens en request_id mogen weg). Er wordt niets opgeslagen. De prijs rekent met onze actuele prijzen, onderdelen en opslag.
curl -X POST 'https://kantoor.voordeeldakopbouw.nl/api/extern/rekentool/prijs' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <API-sleutel>' \
-d @configuratie.json
{
"ok": true,
"formaat": "packhunt",
"prijs": {
"valuta": "EUR",
"exclBtw": 60589.21,
"btw": 12723.73,
"btwPercent": 21,
"inclBtw": 73312.94,
"perM2InclBtw": 1832.82,
"extra": { // optioneel meerwerk, niet in het totaal
"exclBtw": 1750, "inclBtw": 2117.5,
"regels": [{ "stap": "Vergunningsaanvraag", "naam": "Constructie berekening", "exclBtw": 1250 }]
},
"dakvorm": "Schuin (70°)",
"afmetingen": { "diepte": 8, "breedte": 5, "hoogte": 5 },
"nietMeegeteld": [ // wat (nog) niet in de prijs zit
{ "wat": "Optie: Trapgat", "waarom": "…" }
],
"berekendOp": "2026-10-29T16:00:00.000Z"
},
"waarschuwingen": []
}
De bedragen in dit voorbeeld zijn ter illustratie. Toon ze als indicatie; de offerte zelf maken wij. Zolang een code in nietMeegeteld staat, zit die niet in de prijs. Dat lossen wij aan onze kant op.