PechPlan Logo

API Documentatie

API voor garage bedrijven om pashouders te beheren

Quick Start

Base URL

https://api.pechplan.nl/api

Authenticatie

Alle garage API endpoints vereisen authenticatie via een Bearer token. Deze token ontvangt u van PechPlan.

Authorization: Bearer garage_uw_api_token_hier

Content Type

Alle requests moeten JSON content-type header bevatten:

Content-Type: application/json

API Endpoints

Beschikbare Producten

GET

Haal alle beschikbare producten op voor uw garage. Als uw garage specifieke producten heeft, worden alleen die producten getoond.

Endpoint

GET /api/garage/products

Headers

Authorization: Bearer garage_uw_api_token_hier
Accept: application/json

Voorbeeld Response

{
  "message": "Available products retrieved successfully",
  "garage_id": 1,
  "garage_name": "Auto Garage Amsterdam",
  "data": [
    {
      "id": 1,
      "name": "PechPlan Basis",
      "price_roadside_assistance_per_year": "99.00",
      "deposit_reserve_fund_per_year": "50.00",
      "reserve_fund_type": "individueel",
      "eu_coverage": false
    }
  ]
}

cURL Voorbeeld

curl -X GET "https://api.pechplan.nl/api/garage/products" \
  -H "Authorization: Bearer garage_uw_api_token_hier" \
  -H "Accept: application/json"

Pashouders Ophalen

GET

Haal alle pashouders op die bij uw garage zijn geregistreerd. Resultaten zijn gepagineerd (50 per pagina).

Endpoint

GET /api/garage/cardholders

Headers

Authorization: Bearer garage_uw_api_token_hier
Accept: application/json

Query Parameters (optioneel)

page=1
Paginanummer (standaard: 1)

cURL Voorbeeld

curl -X GET "https://api.pechplan.nl/api/garage/cardholders?page=1" \
  -H "Authorization: Bearer garage_uw_api_token_hier" \
  -H "Accept: application/json"

Pashouder Aanmaken/Verlengen

POST

Intelligente Verlenging

Deze endpoint is intelligent! Als het kenteken al bestaat, wordt de pashouder automatisch verlengd of overgezet:

  • Zelfde garage + einddatum binnen 2 maanden: Einddatum wordt verlengd met 1 jaar
  • Andere garage: Pashouder wordt overgezet, nieuwe periode vanaf vandaag
  • Zelfde garage + einddatum buiten 2 maanden: Nieuwe periode vanaf vandaag

Automatische Gegevens

De volgende gegevens worden automatisch gegenereerd en hoeven niet te worden meegegeven:

  • Einddatum: Automatisch 1 jaar na de startdatum
  • Voertuiggegevens (via RDW): Merk, model, brandstof, categorie, registratiedatums worden opgehaald via RDW OpenData API (indien beschikbaar)

Endpoint

POST /api/garage/cardholders

Headers

Authorization: Bearer garage_uw_api_token_hier
Content-Type: application/json
Accept: application/json

Request Body Parameters

Veld Type Verplicht Beschrijving
product_id integer Ja ID van het product
first_name string Ja Voornaam pashouder
last_name string Ja Achternaam pashouder
street_name string Ja Straatnaam
house_number string Ja Huisnummer (incl. toevoeging)
postal_code string Ja Postcode
city string Ja Woonplaats
country string Ja Land
phone_number string Nee Telefoonnummer
email string Nee E-mailadres
start_date date Ja Startdatum (YYYY-MM-DD). Mag niet in het verleden liggen en maximaal 1 maand in de toekomst. Einddatum wordt automatisch +1 jaar.
license_plate string Ja Kenteken (streepjes/spaties worden verwijderd)
brand string Nee Merk (wordt via RDW opgehaald indien leeg)
model string Nee Model (wordt via RDW opgehaald indien leeg)
chassis_number string Ja Chassisnummer
fuel_type string Nee Brandstoftype (wordt via RDW opgehaald indien leeg)

Voorbeeld Request (Minimaal - alleen verplichte velden)

{
  "product_id": 1,
  "first_name": "Jan",
  "last_name": "Jansen",
  "street_name": "Hoofdstraat",
  "house_number": "123",
  "postal_code": "1234AB",
  "city": "Amsterdam",
  "country": "Nederland",
  "start_date": "2026-02-24",
  "license_plate": "ABC01A",
  "chassis_number": "WVW1234567890"
}

ℹ️ Andere voertuiggegevens (merk, model, brandstof, categorie, registratiedatums) worden automatisch opgehaald via RDW OpenData API. De einddatum wordt automatisch 1 jaar na de startdatum gezet.

Voorbeeld Request (Compleet - alle velden)

{
  "product_id": 1,
  "first_name": "Jan",
  "last_name": "Jansen",
  "street_name": "Hoofdstraat",
  "house_number": "123",
  "postal_code": "1234AB",
  "city": "Amsterdam",
  "country": "Nederland",
  "phone_number": "0612345678",
  "email": "jan.jansen@example.com",
  "start_date": "2026-02-24",
  "license_plate": "ABC01A",
  "chassis_number": "WVW1234567890",
  "brand": "Volkswagen",
  "model": "Golf",
  "fuel_type": "Benzine"
}

Voorbeeld Response (Nieuw)

{
  "message": "Cardholder created successfully",
  "action": "created",
  "data": {
    "id": 42,
    "garage_company_id": 1,
    "product_id": 1,
    "first_name": "Jan",
    "last_name": "Jansen",
    "license_plate": "ABC01A",
    "start_date": "2026-02-24",
    "end_date": "2027-02-24",
    "invoiced": false,
    "created_at": "2026-02-24T12:00:00.000000Z",
    "product": {
      "id": 1,
      "name": "PechPlan Basis"
    },
    "garage_company": {
      "id": 1,
      "company_name": "Auto Garage Amsterdam"
    }
  }
}

Voorbeeld Response (Verlengd)

{
  "message": "Cardholder renewed successfully",
  "action": "renewed",
  "data": {
    "id": 42,
    "garage_company_id": 1,
    "end_date": "2028-02-24",
    "invoiced": false,
    ...
  }
}

Voorbeeld Response (Overgedragen)

{
  "message": "Cardholder transferred to new garage successfully",
  "action": "transferred",
  "data": {
    "id": 42,
    "garage_company_id": 2,
    "start_date": "2026-02-24",
    "end_date": "2027-02-24",
    "invoiced": false,
    ...
  }
}

cURL Voorbeeld

curl -X POST "https://api.pechplan.nl/api/garage/cardholders" \
  -H "Authorization: Bearer garage_uw_api_token_hier" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "product_id": 1,
    "first_name": "Jan",
    "last_name": "Jansen",
    "street_name": "Hoofdstraat",
    "house_number": "123",
    "postal_code": "1234AB",
    "city": "Amsterdam",
    "country": "Nederland",
    "start_date": "2026-02-24",
    "license_plate": "ABC01A",
    "chassis_number": "WVW1234567890"
  }'

Error Responses

401 Unauthorized

Ongeldig of ontbrekend API token

{
  "error": "Unauthorized",
  "message": "Invalid or missing garage API token"
}

422 Validation Error

Validatiefout in de request data

{
  "error": "Validation failed",
  "messages": {
    "first_name": ["The first name field is required."],
    "license_plate": ["The license plate field is required."]
  }
}

Voorbeeld bij ongeldige startdatum:

{
  "error": "Validation failed",
  "messages": {
    "start_date": ["De startdatum mag niet in het verleden liggen."]
  }
}

Rate Limiting

De API is beperkt tot 50 verzoeken per minuut per API key.

Limiet Overschreden

Wanneer je de limiet overschrijdt, ontvang je een 429 Too Many Requests response. Wacht tot het volgende minuut interval voordat je nieuwe verzoeken doet.

Response Headers

Elke response bevat headers die informatie geven over je rate limit status:

  • X-RateLimit-Limit: Maximum aantal verzoeken per minuut (50)
  • X-RateLimit-Remaining: Aantal resterende verzoeken in deze minuut
  • Retry-After: Aantal seconden tot de limiet reset (alleen bij 429)

Support

Voor vragen of problemen met de API, neem contact op met PechPlan support.