PechPlan API

Integratiehandleiding voor Dealer Management Systeem (DMS)–leveranciers. Deze API stelt jullie in staat om vanuit jullie eigen software namens een aangesloten garagebedrijf pechhulpproducten op te halen en pechhulppassen aan te maken of te verlengen.

Doelgroep en model

Deze documentatie is bedoeld voor softwareleveranciers die een DMS, garagemanagementsysteem of werkplaatssoftware leveren aan automotive-bedrijven. De integratie werkt als volgt:

Eén token = één garagevestiging. Een DMS-leverancier die meerdere garages bedient, beheert dus één token per klantvestiging in het eigen tenant-/configuratiemodel.

Basis-URL en formaat

https://api.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 (bijv. "79.50") om afrondingsverliezen in jullie boekhouding te voorkomen. Datums zijn ISO-8601 (YYYY-MM-DD). Identifiers zijn UUID-strings.

Versie: v1. Breaking changes worden minstens 30 dagen vooraf aangekondigd op het opgegeven technische contactadres.

Onboarding

  1. De garage logt in op portal.pechplan.nl en gaat naar het API-tokenbeheer.
  2. De garage maakt een token aan met een herkenbare naam (bijv. "Koppeling [naam DMS]") en kopieert dit eenmalig zichtbare token.
  3. De garage plakt het token in jullie DMS-configuratie. Bewaar het in jullie systeem versleuteld at-rest en lever het nooit terug aan de gebruiker.
  4. Jullie DMS test direct de koppeling door GET /roadside-products aan te roepen. Een 200-response bevestigt dat het token werkt en koppelt aan een actieve garage.
Aanbeveling: bouw een "Test verbinding"-knop in jullie configuratiescherm die GET /roadside-products aanroept en het aantal beschikbare producten toont. Dit verkort de supportcyclus aanzienlijk.

Authenticatie

Alle endpoints (behalve deze pagina) vereisen een Bearer token in de Authorization-header:

Authorization: Bearer <token>
Accept: application/json

Tokens worden door de garage zelf in het portal aangemaakt en ingetrokken. Een ingetrokken token werkt direct niet meer — vang 401-responses dus altijd af en toon de eindgebruiker een duidelijke melding dat de PechPlan-koppeling opnieuw geconfigureerd moet worden.

Bewaaradvies

Foutafhandeling

StatusBetekenisAanbevolen DMS-gedrag
200OKVerwerk de response.
400Slecht gevormd verzoek (geen geldige JSON).Bug in jullie integratie — niet retry-en.
401Token ontbreekt, is ongeldig of ingetrokken.Markeer de koppeling als "her-configuratie nodig" en informeer de gebruiker.
403De garage heeft geen recht om dit endpoint te gebruiken (bv. mag geen pechhulp verkopen).Toon een duidelijke melding; niet retry-en.
404Endpoint of resource bestaat niet.Niet retry-en.
422Validatiefout op de payload, of business-rule afgewezen (bv. te vroege verlenging).Toon de veldfouten uit het response-body.
429Rate limit overschreden.Wacht en retry met exponential back-off (zie hieronder).
500–504Onverwachte fout aan onze kant.Retry met back-off (max 3 pogingen). Bij blijvende fout: zet in queue en alarmeer ons via support.

Foutformaat

Bij 422 en andere clientfouten leveren we een Laravel-stijl foutobject:

{
  "message": "The given data was invalid.",
  "errors": {
    "kenteken": ["Het kenteken is verplicht."],
    "postcode": ["Postcode moet voldoen aan formaat 1234AB."]
  }
}

Rate limiting

Standaard 60 requests per minuut per token. Voor batch-scenario's (bijv. nachtelijke synchronisatie van een groot wagenpark) raden we aan om requests te spreiden of contact op te nemen voor een verhoogd limiet. Bij overschrijding krijg je een 429; pas exponential back-off toe (1s, 2s, 4s, …) tot maximaal 60 seconden.

Endpoints

GET/roadside-products

Levert de pechhulpproducten die voor de aan het token gekoppelde garage beschikbaar zijn. De productset kan per garage verschillen op basis van formule-/netwerkafspraken — cache de uitkomst dus per token, niet globaal.

Aanbevolen gebruik in jullie DMS

Voorbeeldverzoek

curl https://api.pechplan.nl/roadside-products \
  -H "Authorization: Bearer <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 (servicebedrag + reserveringen). Geschikt voor doorbelasting op de factuur.
currencystringAltijd "EUR".

POST/roadside-passes

Maakt een pechhulppas aan voor de eindklant van de garage, of verlengt een bestaande pas. Dit is het hoofdintegratiepunt: meestal aangeroepen op het moment dat de garage het product op een werkorder/factuur zet of die order afsluit in jullie DMS.

Gedrag

Verzoeklichaam

VeldTypeVerplichtBeschrijving
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.
invoice_idstringneeEigen factuur-/orderreferentie uit jullie DMS. Wij slaan dit op zodat support koppelingen tussen pas en factuur kan herleiden.

Voorbeeldverzoek

curl -X POST https://api.pechplan.nl/roadside-passes \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "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",
    "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",
    "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",
    "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.customer_id / pass.vehicle_idStabiele identifiers binnen het PechPlan-systeem. Optioneel te bewaren voor latere referentie.

Endpoint-specifieke foutcodes

StatusBetekenis
403De aan het token gekoppelde garage mag geen pechhulpproducten verkopen.
422Validatiefout op de payload, of er bestaat een actieve pas die nog niet verlengd mag worden (alleen mogelijk in de laatste 2 maanden van de looptijd).

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

UX-richtlijnen voor de eindgebruiker

Sandbox-omgeving

Voor integratiepartners is een sandbox-token beschikbaar. Sandbox-tokens gebruiken dezelfde endpoints, dezelfde URL's, dezelfde validatieregels en dezelfde response-structuur als productie. Het verschil zit alleen aan onze kant: verzoeken met een sandbox-token worden niet verwerkt — er worden geen passen, klanten of facturen aangemaakt. De response is voor de aanroeper niet te onderscheiden van een echte productieresponse.

Vraag een sandbox-token aan via info@pechplan.nl. Daarmee kun je het volgende testen:

Productenlijst

GET /roadside-products retourneert in sandbox een vaste lijst met twee producten met de volgende product_id's. Gebruik een van deze in POST /roadside-passes:

Test-kentekens

POST /roadside-passes reageert in sandbox op basis van het kenteken:

Kenteken HTTP Resultaat
11AABB 200 Succesvolle nieuwe pas (action: "created")
33EEFF 200 Succesvolle verlenging (action: "extended")
22CCDD 422 "This pass can only be extended in the last 2 months of its term."
elk ander kenteken 422 "No vehicle found for this license plate."

Gebruik dit om je integratie end-to-end te testen voordat je overstapt naar een productietoken.

Productieverzoeken creëren echte passen en facturen. Er is geen dry-run flag op productie-tokens; bouw daarom in jullie eigen UI een duidelijke bevestigingsstap voordat POST /roadside-passes wordt aangeroepen.

Wijzigingsbeleid en versionering

De huidige API is versie v1. Backward-compatibele uitbreidingen (nieuwe optionele velden, nieuwe endpoints) kunnen zonder waarschuwing worden uitgerold. Breaking changes worden minstens 30 dagen vooraf aangekondigd op het bij ons bekende technisch contactadres en gaan altijd gepaard met een nieuwe versiering (v2) op een nieuw pad of subdomein.

Contact en onboarding-support

Voor partner-onboarding, technische vragen of het aanmelden van een nieuwe DMS-koppeling: info@pechplan.nl. Geef bij aanmelding aan welke DMS-software jullie leveren, een schatting van het aantal aangesloten garages, en een technisch contactpersoon voor proactieve communicatie over wijzigingen.

v1 PechPlan API