PechPlan Platform API v1

Integratiehandleiding voor formules — beheer garages en bestelling van pechhulppassen vanuit één API-koppeling.

Voor wie is deze API?

De Platform API (https://platform.pechplan.nl) is bedoeld voor formules die op grotere schaal garages beheren binnen het PechPlan-netwerk. De endpoints zijn identiek aan die van api.pechplan.nl, met als toevoeging dat formules nieuwe garages kunnen aanmaken via de API en zo zelf hun keten kunnen uitbreiden.

Basis-URL en formaat

https://platform.pechplan.nl

Alle requests en responses zijn JSON (Content-Type: application/json, Accept: application/json). Bedragen zijn in euro's en worden als string met twee decimalen geleverd. Datums zijn ISO-8601 (YYYY-MM-DD). Identifiers zijn UUID-strings.

Authenticatie — één formule-token voor alles

De Platform API gebruikt één Bearer-token per formule. Met dat token kun je álle endpoints aanroepen:

De API valideert bij elk verzoek dat de opgegeven garage_id aan de formule van het token is gekoppeld — je kunt dus nooit per ongeluk acties uitvoeren op een garage van een andere formule.

Workflow: maak eerst een garage aan via POST /garages. Bewaar de geretourneerde id. Gebruik die id vervolgens als garage_id bij GET /roadside-products en POST /roadside-passes om namens die garage te handelen.

Headers

Alle endpoints (behalve deze pagina) vereisen de volgende headers:

Authorization: Bearer <formule-token>
Content-Type: application/json
Accept: application/json

Tokens worden door PechPlan-beheer aangemaakt voor je formule en zijn éénmalig zichtbaar. Bewaar ze versleuteld at-rest en lever ze nooit terug aan de eindgebruiker.

POST /garages

Maakt een nieuwe garage aan die direct actief is en gekoppeld is aan de formule waarvan het token is uitgegeven. Bewaar de geretourneerde id — die heb je nodig als garage_id bij alle andere endpoints.

Request body

VeldTypeVerplichtBeschrijving
bedrijfsnaamstringjaHandelsnaam van de garage, max 255 tekens.
straatnaamstringjaStraatnaam zonder huisnummer.
huisnummerstringjaHuisnummer, max 10 tekens.
huisnummer_toevoegingstringneeToevoeging (bijv. "A", "bis").
postcodestringjaNederlandse postcode, format 1234 AB of 1234AB.
plaatsnaamstringjaVestigingsplaats.
telefoonnummerstringjaAlgemeen contactnummer van de garage.
emailadresstringjaAlgemeen mailadres van de garage.
ibanstringneeVoor toekomstige betalingen, max 34 tekens.
can_sell_roadside_assistancebooleanneeStandaard true voor via platform aangemaakte garages.
can_sell_insurancesbooleanneeStandaard true voor via platform aangemaakte garages.

Voorbeeld-request

curl -X POST https://platform.pechplan.nl/garages \
  -H "Authorization: Bearer <formule-token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "bedrijfsnaam": "Autobedrijf De Zwaan",
    "straatnaam": "Industrieweg",
    "huisnummer": "42",
    "postcode": "1234 AB",
    "plaatsnaam": "Amsterdam",
    "telefoonnummer": "+31201234567",
    "emailadres": "info@dezwaan.nl",
    "can_sell_roadside_assistance": true
  }'

Response — 201 Created

{
  "id": "9c8b7a6e-1234-5678-9abc-def012345678",
  "bedrijfsnaam": "Autobedrijf De Zwaan",
  "straatnaam": "Industrieweg",
  "huisnummer": "42",
  "huisnummer_toevoeging": null,
  "postcode": "1234 AB",
  "plaatsnaam": "Amsterdam",
  "telefoonnummer": "+31201234567",
  "emailadres": "info@dezwaan.nl",
  "iban": null,
  "is_active": true,
  "formula_id": "...",
  "created_at": "2026-05-28T10:42:00+02:00"
}

Bewaar de id in je systeem — die heb je nodig bij het aanmaken van pashouders namens deze garage.

Tip: de garage is direct actief omdat het formule-token impliceert dat PechPlan de formule (en daarmee de toegevoegde garages) vertrouwt. Je kunt direct pashouders aanmaken voor deze garage zonder verdere goedkeuring.

GET /garages

Levert alle garages die aan je formule zijn gekoppeld. Handig om in jullie systeem een actueel overzicht van je keten te synchroniseren of om de id van een bestaande garage op te zoeken voor de andere endpoints.

Voorbeeldverzoek

curl "https://platform.pechplan.nl/garages" \
  -H "Authorization: Bearer <formule-token>" \
  -H "Accept: application/json"

Voorbeeldantwoord — 200 OK

{
  "data": [
    {
      "id": "9c8b7a6e-1234-5678-9abc-def012345678",
      "bedrijfsnaam": "Autobedrijf De Zwaan",
      "straatnaam": "Industrieweg",
      "huisnummer": "42",
      "huisnummer_toevoeging": null,
      "postcode": "1234 AB",
      "plaatsnaam": "Amsterdam",
      "telefoonnummer": "+31201234567",
      "emailadres": "info@dezwaan.nl",
      "iban": null,
      "is_active": true,
      "can_sell_roadside_assistance": true,
      "can_sell_insurances": true,
      "created_at": "2026-05-28T10:42:00+02:00"
    }
  ]
}

Veldbeschrijving

VeldTypeBeschrijving
idstring (UUID)Stabiele identifier van de garage. Gebruik deze als garage_id bij de andere endpoints.
bedrijfsnaamstringHandelsnaam van de garage.
is_activebooleanOf de garage actief is binnen het PechPlan-netwerk.
can_sell_roadside_assistancebooleanOf de garage pechhulppassen mag verkopen.
can_sell_insurancesbooleanOf de garage verzekeringen mag verkopen.
De overige velden (straatnaam, huisnummer, huisnummer_toevoeging, postcode, plaatsnaam, telefoonnummer, emailadres, iban, created_at) zijn identiek aan de respons van POST /garages.

GET /garages/balance

Levert het actuele saldo van de reservepot van een garage binnen je formule. Dit is hetzelfde saldo dat in het PechPlan-portaal zichtbaar is: het loopt op met afdrachten en daalt met uitbetalingen/kosten en kan negatief zijn.

Query-parameters

ParameterVerplichtBeschrijving
garage_idjaUUID van de garage binnen je formule. Verkregen uit het antwoord van POST /garages of bij eerder aangemaakte garages bekend in jullie systeem.

Voorbeeldverzoek

curl "https://platform.pechplan.nl/garages/balance?garage_id=9c8b7a6e-1234-5678-9abc-def012345678" \
  -H "Authorization: Bearer <formule-token>" \
  -H "Accept: application/json"

Voorbeeldantwoord — 200 OK

{
  "garage_id": "9c8b7a6e-1234-5678-9abc-def012345678",
  "bedrijfsnaam": "Autobedrijf De Zwaan",
  "balance": "1240.50",
  "currency": "EUR"
}

Veldbeschrijving

VeldTypeBeschrijving
garage_idstring (UUID)De garage waarvoor het saldo geldt.
bedrijfsnaamstringHandelsnaam van de garage.
balancestringActueel saldo van de reservepot in euro's, met twee decimalen. Kan negatief zijn.
currencystringAltijd "EUR".

GET /roadside-passes

Levert de actieve passen binnen je formule. Een pas geldt als actief wanneer de status active is én de vervaldatum (expires_at) vandaag of in de toekomst ligt. Verlopen en geannuleerde passen worden niet meegeleverd.

Zonder parameters krijg je de actieve passen van alle garages binnen je formule. Geef je garage_id mee, dan wordt het resultaat beperkt tot die ene garage.

Query-parameters

ParameterVerplichtBeschrijving
garage_idneeUUID van een garage binnen je formule. Weglaten om over de hele formule op te vragen; meegeven om te beperken tot die garage.

Voorbeeldverzoek

# Over de hele formule
curl "https://platform.pechplan.nl/roadside-passes" \
  -H "Authorization: Bearer <formule-token>" \
  -H "Accept: application/json"

# Beperkt tot één garage
curl "https://platform.pechplan.nl/roadside-passes?garage_id=9c8b7a6e-1234-5678-9abc-def012345678" \
  -H "Authorization: Bearer <formule-token>" \
  -H "Accept: application/json"

Voorbeeldantwoord — 200 OK

{
  "data": [
    {
      "id": "1f2e3d4c-…",
      "garage_id": "9c8b7a6e-1234-5678-9abc-def012345678",
      "product_id": "aabbccdd-…",
      "kenteken": "12ABC3",
      "issued_at": "2026-01-15",
      "expires_at": "2027-01-15",
      "status": "active",
      "auto_renew": true,
      "invoice_id": "5a6b7c8d-…",
      "customer_id": "9e8d7c6b-…",
      "vehicle_id": "3c2b1a0f-…",
      "customer": {
        "id": "9e8d7c6b-…",
        "bedrijfsnaam": null,
        "voornaam": "Jan",
        "achternaam": "Jansen",
        "straatnaam": "Hoofdstraat",
        "huisnummer": "12",
        "huisnummer_toevoeging": null,
        "postcode": "1234 AB",
        "plaatsnaam": "Amsterdam",
        "telefoonnummer": "0612345678",
        "emailadres": "jan@example.nl",
        "geboortedatum": "1985-03-20"
      },
      "vehicle": {
        "id": "3c2b1a0f-…",
        "kenteken": "12ABC3",
        "merk": "Tesla",
        "handelsbenaming": "Model 3",
        "kleur": "Wit",
        "brandstof": "Elektriciteit",
        "chassisnummer": "WVWZZZ1KZBM123456",
        "apk_vervaldatum": "2029-02-19",
        "datum_tenaamstelling": "2025-02-19"
      },
      "product": {
        "id": "aabbccdd-…",
        "name": "PechPlan EU",
        "total_yearly_price": "135.00",
        "eu_coverage": true,
        "currency": "EUR"
      }
    }
  ]
}

Veldbeschrijving

VeldTypeBeschrijving
idstring (UUID)Unieke identifier van de pas.
garage_idstring (UUID)De garage waaronder de pas is uitgegeven.
product_idstring (UUID)Het pechhulpproduct van de pas.
kentekenstringKenteken van het gedekte voertuig.
issued_atstring (datum)Ingangsdatum (YYYY-MM-DD).
expires_atstring (datum)Vervaldatum (YYYY-MM-DD).
statusstringAltijd "active" in dit antwoord.
auto_renewbooleantrue als automatische verlenging aanstaat voor deze pas.
invoice_idstring (UUID) of nullBijbehorende factuur, indien aanwezig.
customer_idstring (UUID)De eindklant van de pas (zie ook het geneste customer-object).
vehicle_idstring (UUID)Het gedekte voertuig (zie ook het geneste vehicle-object).
customerobjectDe volledige klantgegevens: id, bedrijfsnaam, voornaam, achternaam, straatnaam, huisnummer, huisnummer_toevoeging, postcode, plaatsnaam, telefoonnummer, emailadres, geboortedatum. Optionele velden kunnen null zijn.
vehicleobjectDe voertuiggegevens (uit de RDW-koppeling): id, kenteken, merk, handelsbenaming, kleur, brandstof, chassisnummer, apk_vervaldatum, datum_tenaamstelling. Velden die de RDW niet levert kunnen null zijn.
productobjectHet pechhulpproduct: id, name, total_yearly_price (string, twee decimalen), eu_coverage (boolean) en currency (altijd "EUR").

PATCH /roadside-passes/{id}/auto-renew

Zet automatische verlenging aan of uit voor een bestaande, nog actieve pas. Staat automatische verlenging aan, dan verlengt PechPlan de pas automatisch (en factureert die) op de dag vóór de vervaldatum — er is dan geen apart POST /roadside-passes-verzoek meer nodig om te verlengen.

Automatische verlenging kan alleen worden gewijzigd zolang de pas actief is (niet geannuleerd of verlopen). De {id} in het pad is de id van de pas, zoals geretourneerd door POST /roadside-passes of GET /roadside-passes.

Request body

VeldTypeVerplichtOmschrijving
auto_renewbooleanjatrue om automatische verlenging aan te zetten, false om uit te zetten.

Voorbeeldverzoek

curl -X PATCH "https://platform.pechplan.nl/roadside-passes/f0e8d1a2-3b5c-4d6e-8f7a-9b0c1d2e3f4a/auto-renew" \
  -H "Authorization: Bearer <formule-token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{ "auto_renew": false }'

Voorbeeldantwoord — 200 OK

{
  "id": "f0e8d1a2-3b5c-4d6e-8f7a-9b0c1d2e3f4a",
  "auto_renew": false
}

Veldbeschrijving

VeldTypeBeschrijving
idstring (UUID)De pas waarvan de instelling is gewijzigd.
auto_renewbooleanDe nieuwe status van automatische verlenging.

PATCH /roadside-passes/{id}/kenteken

Wijzigt het kenteken van een bestaande, nog actieve pas. De overige voertuiggegevens (merk, handelsbenaming, kleur, brandstof, APK-vervaldatum, tenaamstelling) worden automatisch opgehaald via de RDW-koppeling en aan de pas gekoppeld. De looptijd, klant en overige pasgegevens blijven ongewijzigd.

Het kenteken kan alleen worden gewijzigd zolang de pas actief is (niet geannuleerd of verlopen). De {id} in het pad is de id van de pas, zoals geretourneerd door POST /roadside-passes of GET /roadside-passes.

Request body

VeldTypeVerplichtOmschrijving
kentekenstringjaHet nieuwe kenteken. Wordt genormaliseerd (hoofdletters, zonder streepjes).
chassisnummerstringneeOptioneel VIN; alleen gebruikt om het chassisnummer aan te vullen als dat nog ontbreekt.

Voorbeeldverzoek

curl -X PATCH "https://platform.pechplan.nl/roadside-passes/f0e8d1a2-3b5c-4d6e-8f7a-9b0c1d2e3f4a/kenteken" \
  -H "Authorization: Bearer <formule-token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{ "kenteken": "0001TJ" }'

Voorbeeldantwoord — 200 OK

{
  "action": "kenteken_updated",
  "pass": {
    "id": "f0e8d1a2-3b5c-4d6e-8f7a-9b0c1d2e3f4a",
    "product_id": "9b1f3a4d-6c2e-4f8a-9b1d-3e5a7c9f0b12",
    "kenteken": "0001TJ",
    "issued_at": "2026-04-28",
    "expires_at": "2027-04-28",
    "status": "active",
    "auto_renew": true,
    "invoice_id": "WO-2026-04827",
    "customer_id": "a1b2c3d4-e5f6-7890-abcd-ef0123456789",
    "vehicle_id": "9f8e7d6c-5b4a-3c2d-1e0f-a9b8c7d6e5f4"
  }
}

Veldbeschrijving

VeldBeschrijving
actionAltijd "kenteken_updated" bij succes.
pass.kentekenHet nieuwe, genormaliseerde kenteken.
pass.vehicle_idVerwijst nu naar het voertuig van het nieuwe kenteken (met de via RDW opgehaalde gegevens).

GET /garages/roadside-settings

Levert de pechhulpinstellingen van een garage binnen je formule: de openingstijden, de straal rondom het adres die het werkgebied bepaalt, en de telefoonnummers (met naam en volgorde).

Query-parameters

ParameterVerplichtBeschrijving
garage_idjaUUID van de garage binnen je formule.

Voorbeeldverzoek

curl "https://platform.pechplan.nl/garages/roadside-settings?garage_id=9c8b7a6e-1234-5678-9abc-def012345678" \
  -H "Authorization: Bearer <formule-token>" \
  -H "Accept: application/json"

Voorbeeldantwoord — 200 OK

{
  "garage_id": "9c8b7a6e-1234-5678-9abc-def012345678",
  "bedrijfsnaam": "Autobedrijf De Zwaan",
  "service_radius_km": "25.00",
  "opening_hours": {
    "mon": [{ "open": "08:00", "close": "12:00" }, { "open": "13:00", "close": "17:30" }],
    "tue": [{ "open": "08:00", "close": "17:30" }],
    "sat": [{ "open": "09:00", "close": "13:00" }]
  },
  "phone_numbers": [
    { "id": "1a2b3c4d-…", "label": "Werkplaats", "phone": "31201234567", "paused": false, "position": 0 },
    { "id": "5e6f7a8b-…", "label": "Pechhulp 24/7", "phone": "31612345678", "paused": false, "position": 1 }
  ]
}

Veldbeschrijving

VeldTypeBeschrijving
service_radius_kmstring of nullStraal in kilometers rondom het garageadres die het werkgebied bepaalt. null als (nog) niet ingesteld.
opening_hoursobjectObject met dagsleutels mon, tue, wed, thu, fri, sat, sun. Elke dag is een lijst van blokken met open en close (formaat HH:MM). Dagen zonder openingstijden ontbreken (gesloten). Meerdere blokken per dag zijn toegestaan (bijv. ochtend + middag).
phone_numbersarrayTelefoonnummers op volgorde (position oplopend). Per nummer: id, label (naam), phone (internationaal, zonder +), paused en position.

PUT /garages/roadside-settings

Past de pechhulpinstellingen aan. De velden zijn declaratief: wat je meestuurt vervangt de huidige instelling volledig. Stuur je een veld niet mee, dan blijft dat onderdeel ongewijzigd.

Gedrag

Verzoeklichaam

VeldTypeVerplichtBeschrijving
service_radius_kmnumbernee0–500. Straal van het werkgebied in kilometers.
opening_hoursobjectneeDagsleutels monsun, elk een lijst van { "open": "HH:MM", "close": "HH:MM" }.
phone_numbersarrayneeLijst van telefoonnummers in gewenste volgorde.
phone_numbers[].idstring (UUID)neeLaat weg om een nieuw nummer aan te maken; geef mee om een bestaand nummer te wijzigen.
phone_numbers[].labelstringneeNaam/omschrijving, bijv. "Werkplaats".
phone_numbers[].phonestringjaTelefoonnummer. 0612345678 en +31 6 12345678 worden geaccepteerd en genormaliseerd.
phone_numbers[].pausedbooleanneeStandaard false. Gepauzeerde nummers worden niet gebruikt voor doorschakeling.

Voorbeeldverzoek

curl -X PUT "https://platform.pechplan.nl/garages/roadside-settings?garage_id=9c8b7a6e-1234-5678-9abc-def012345678" \
  -H "Authorization: Bearer <formule-token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "service_radius_km": 25,
    "opening_hours": {
      "mon": [{ "open": "08:00", "close": "12:00" }, { "open": "13:00", "close": "17:30" }],
      "tue": [{ "open": "08:00", "close": "17:30" }],
      "sat": [{ "open": "09:00", "close": "13:00" }]
    },
    "phone_numbers": [
      { "id": "1a2b3c4d-…", "label": "Werkplaats", "phone": "0201234567" },
      { "label": "Pechhulp 24/7", "phone": "0612345678" }
    ]
  }'

Het antwoord is identiek aan dat van GET /garages/roadside-settings en weerspiegelt de zojuist opgeslagen staat — inclusief de id's van nieuw aangemaakte telefoonnummers.

Let op: omdat de velden de huidige instelling volledig vervangen, raden we aan eerst GET te doen, de gewenste wijzigingen toe te passen op het opgehaalde object, en dat geheel terug te sturen met PUT. Zo verwijder je nooit per ongeluk bestaande openingstijden of telefoonnummers.

GET /roadside-products

Levert de pechhulpproducten die voor de opgegeven garage beschikbaar zijn. De productset kan per garage verschillen — cache de uitkomst dus per garage_id, niet globaal.

Welke producten worden getoond? Het meest specifieke niveau bepaalt de volledige lijst (één niveau wint):
  1. Garage-specifiek — zijn er producten rechtstreeks aan deze garage gekoppeld, dan worden alleen die getoond.
  2. Anders formule-specifiek — de producten die aan de formule van deze garage zijn gekoppeld.
  3. Anders de algemene producten die voor iedereen beschikbaar zijn.
Een garage met eigen productafspraken ziet dus uitsluitend die producten, en niet daarnaast nog de formule- of algemene producten.

Query-parameters

ParameterVerplichtBeschrijving
garage_idjaUUID van de garage binnen je formule. Verkregen uit het antwoord van POST /garages of bij eerder aangemaakte garages bekend in jullie systeem.

Aanbevolen gebruik

Voorbeeldverzoek

curl "https://platform.pechplan.nl/roadside-products?garage_id=9c8b7a6e-1234-5678-9abc-def012345678" \
  -H "Authorization: Bearer <formule-token>" \
  -H "Accept: application/json"

Voorbeeldantwoord

{
  "data": [
    {
      "product_id": "9b1f3a4d-6c2e-4f8a-9b1d-3e5a7c9f0b12",
      "description": "PechPlan Basis",
      "total_yearly_price": "79.50",
      "currency": "EUR"
    },
    {
      "product_id": "1c8b2e7f-4a91-4c63-9d20-7f6b3a1e2c45",
      "description": "PechPlan Plus EU",
      "total_yearly_price": "129.00",
      "currency": "EUR"
    }
  ]
}

Veldbeschrijving

VeldTypeBeschrijving
product_idstring (UUID)Stabiele identifier van het product. Gebruik deze in vervolgverzoeken.
descriptionstringDoor PechPlan beheerde productnaam, geschikt voor weergave aan de eindgebruiker.
total_yearly_pricestringTotale jaarprijs incl. alle componenten. Geschikt voor doorbelasting op de factuur.
currencystringAltijd "EUR".

POST /roadside-passes

Maakt een pechhulppas aan voor de eindklant van een specifieke garage binnen je formule, of verlengt een bestaande pas. Dit is het hoofdintegratiepunt: meestal aangeroepen op het moment dat een werkorder/factuur wordt afgesloten in jullie systeem.

Gedrag

Verzoeklichaam

VeldTypeVerplichtBeschrijving
garage_idUUIDjaGarage binnen je formule. Verkregen uit POST /garages.
product_idUUIDjaUit /roadside-products.
kentekenstringjaNederlands kenteken zonder streepjes, hoofdletters (bijv. 2ZPZ13).
chassisnummerstringneeVIN/chassisnummer. Optioneel — laat leeg of weg indien niet beschikbaar.
voornaamstringja
achternaamstringja
straatnaamstringja
huisnummerstringja
huisnummer_toevoegingstringnee
postcodestringja1234AB of 1234 AB.
plaatsnaamstringja
bedrijfsnaamstringneeVoor zakelijke klanten.
telefoonnummerstringnee
emailadresstringneeSterk aanbevolen: gebruikt voor klant-deduplicatie.
geboortedatumstring (YYYY-MM-DD)neeMoet in het verleden liggen.
auto_renewbooleanneeZet automatische verlenging aan of uit. Standaard false. Bij true verlengt PechPlan de pas automatisch (en factureert) op de dag vóór de vervaldatum. Kan later ook via PATCH /roadside-passes/{id}/auto-renew worden aangepast.
invoice_idstringneeEigen factuur-/orderreferentie uit jullie systeem. Wij slaan dit op zodat support koppelingen tussen pas en factuur kan herleiden.

Voorbeeldverzoek

curl -X POST https://platform.pechplan.nl/roadside-passes \
  -H "Authorization: Bearer <formule-token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "garage_id": "9c8b7a6e-1234-5678-9abc-def012345678",
    "product_id": "9b1f3a4d-6c2e-4f8a-9b1d-3e5a7c9f0b12",
    "kenteken": "2ZPZ13",
    "chassisnummer": "WVWZZZ1KZBM123456",
    "voornaam": "Jan",
    "achternaam": "Jansen",
    "straatnaam": "Hoofdstraat",
    "huisnummer": "12",
    "postcode": "1234 AB",
    "plaatsnaam": "Amsterdam",
    "telefoonnummer": "0612345678",
    "emailadres": "jan@example.nl",
    "auto_renew": true,
    "invoice_id": "WO-2026-04827"
  }'

Voorbeeldantwoord (nieuwe pas)

{
  "action": "created",
  "pass": {
    "id": "f0e8d1a2-3b5c-4d6e-8f7a-9b0c1d2e3f4a",
    "product_id": "9b1f3a4d-6c2e-4f8a-9b1d-3e5a7c9f0b12",
    "kenteken": "2ZPZ13",
    "issued_at": "2026-04-28",
    "expires_at": "2027-04-28",
    "status": "active",
    "auto_renew": true,
    "invoice_id": "WO-2026-04827",
    "customer_id": "a1b2c3d4-e5f6-7890-abcd-ef0123456789",
    "vehicle_id": "1234abcd-5678-90ef-1234-567890abcdef"
  }
}

Voorbeeldantwoord (verlenging)

{
  "action": "extended",
  "pass": {
    "id": "f0e8d1a2-3b5c-4d6e-8f7a-9b0c1d2e3f4a",
    "product_id": "9b1f3a4d-6c2e-4f8a-9b1d-3e5a7c9f0b12",
    "kenteken": "2ZPZ13",
    "issued_at": "2025-05-10",
    "expires_at": "2027-05-10",
    "status": "active",
    "auto_renew": true,
    "invoice_id": "WO-2026-04827",
    "customer_id": "a1b2c3d4-e5f6-7890-abcd-ef0123456789",
    "vehicle_id": "1234abcd-5678-90ef-1234-567890abcdef"
  }
}

Veldbeschrijving antwoord

VeldBeschrijving
action"created" bij een nieuwe pas, "extended" bij verlenging van een bestaande pas.
pass.idStabiele identifier van de pas. Bewaar deze in jullie order-/factuurregel zodat support het verband kan herleiden.
pass.issued_atOriginele ingangsdatum (blijft staan bij verlenging).
pass.expires_atVervaldatum (1 jaar na ingang, of huidige vervaldatum + 1 jaar bij verlenging).
pass.statusAltijd "active" bij succesvolle responses.
pass.auto_renewtrue als automatische verlenging aanstaat, anders false.
pass.customer_id / pass.vehicle_idStabiele identifiers binnen het PechPlan-systeem. Optioneel te bewaren voor latere referentie.

Implementatie-aanbevelingen

Idempotency en retries

Het /roadside-passes-endpoint is op basis van garage + kenteken + product + tijdvenster de-facto idempotent: een herhaald verzoek binnen dezelfde dag voor dezelfde combinatie levert in de regel hetzelfde resultaat (verlengen of error op te-vroege verlenging). Toch raden we aan:

Logging en auditing

Verzoeken creëren echte passen en facturen. Bouw daarom in jullie eigen UI een duidelijke bevestigingsstap voordat POST /roadside-passes wordt aangeroepen.

Foutafhandeling

StatusBetekenis
401Token ontbreekt of is ingetrokken.
403De opgegeven garage mag dit type product niet verkopen (bijv. can_sell_roadside_assistance staat uit).
404De opgegeven garage_id bestaat niet of hoort niet bij je formule.
422Validatiefout. Het response-veld errors bevat per veld een lijst met meldingen.
429Rate limit overschreden (60 requests/minuut/IP).
500Interne fout — al onze logs worden gemonitord; neem contact op als deze blijft optreden.

Contact

Voor technische vragen: info@pechplan.nl.