Quick Start
Base URL
Authenticatie
Alle garage API endpoints vereisen authenticatie via een Bearer token. Deze token ontvangt u van PechPlan.
Content Type
Alle requests moeten JSON content-type header bevatten:
API Endpoints
Beschikbare Producten
GETHaal alle beschikbare producten op voor uw garage. Als uw garage specifieke producten heeft, worden alleen die producten getoond.
Endpoint
Headers
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
GETHaal alle pashouders op die bij uw garage zijn geregistreerd. Resultaten zijn gepagineerd (50 per pagina).
Endpoint
Headers
Query Parameters (optioneel)
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
POSTIntelligente 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
Headers
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 |
| 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 minuutRetry-After: Aantal seconden tot de limiet reset (alleen bij 429)
Support
Voor vragen of problemen met de API, neem contact op met PechPlan support.