Voor wie de configurator bouwt

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

  1. De klant stelt zijn dakopbouw samen in de configurator en drukt op offerte aanvragen.
  2. Jullie server stuurt het JSON van de configuratie naar ons endpoint (hieronder), met de API-sleutel.
  3. Wij antwoorden direct met 201 en 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.
  4. Jullie tonen je eigen bedankpagina. Die hoeft niets naar ons te linken of door te sturen: met het antwoord ok: true weet 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

Aanvraag insturenPOST 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:

VeldUitleg
request_idAanbevolen. 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.
referenceAls 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.
customerZonder 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.
remarkOptioneel: 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": []
}
StatusBetekenis
201Aangemaakt. Toon de bedankpagina.
200Bijgewerkt: dit request_id was al binnen.
400Geen geldige JSON.
401API-sleutel ontbreekt of klopt niet.
413Groter dan 256 KB.
422De aanvraag klopt niet, bijvoorbeeld geen referentie en geen e-mail/telefoon. In fouten staat per veld wat er mis is.
429Te veel verzoeken; wacht het aantal seconden uit de Retry-After-header.
503De 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.