---
title: "Planner"
icon: "calendar"
visibility: "public"
---

Beschikbaarheid opvragen en afspraken inplannen bij een vestiging, ongeacht welk agendasysteem die garage gebruikt.

De volledige request- en responsestructuur staat in de [API-referentie](/api/vakgarage), onder Planner.

Alle planner-endpoints staan onder `/api/{franchiseId}/planner/...`; zie [Client types](/apiportaal/api/client-types) voor hoe je een vestiging aanspreekt en wie waar bij mag.

---

## Eén interface, meerdere systemen

Achter de planner zitten verschillende agendasystemen: **Carsys**, **Carsys Online**, **Plan-It**, **AutoFlex Ten** en **Automaat**.

Welk systeem een vestiging gebruikt is door de beheerder ingesteld — daar hoef je als afnemer niets voor te doen, en je merkt het niet aan de antwoorden. De API vertaalt je verzoek naar het juiste systeem en geeft altijd dezelfde genormaliseerde vorm terug.

---

## Endpoints

| Methode | Pad | Waarvoor |
|---|---|---|
| `GET` | `/planner/activities` | welke werkzaamheden deze garage aanbiedt |
| `GET` | `/planner/first-available-dates` | de eerstvolgende open dagen |
| `GET` | `/planner/available-dates` | kalenderoverzicht van een maand |
| `GET` | `/planner/available-times` | tijdsloten op een datum |
| `GET` | `/planner/replacement-vehicles` | beschikbaar vervangend vervoer |
| `POST` | `/planner/appointments` | de afspraak boeken |

---

## Werkzaamheden

### Verzoek

```
GET /api/{franchiseId}/planner/activities
```

### Antwoord

```json
[
  {
    "id": "c4813820-92cf-48c6-6861-0b8314403db7",
    "name": "APK",
    "duration": 60,
    "enabled": true,
    "description": ""
  },
  {
    "id": "96cde5e5-049f-4347-490a-18918f15c62a",
    "name": "Grote beurt",
    "duration": 60,
    "enabled": true,
    "description": ""
  }
]
```

| Veld | Beschrijving |
|---|---|
| `id` | meesturen bij het opvragen van datums en bij het boeken |
| `duration` | verwachte duur in minuten |
| `enabled` | `false` betekent: wel bekend, maar nu niet te kiezen |
| `description` | toelichting; vaak leeg |

---

## Beschikbare datums

### Verzoek

```
GET /api/{franchiseId}/planner/available-dates?month=11&year=2026
```

| Parameter | Verplicht | Beschrijving |
|---|---|---|
| `month` | ja | maandnummer, 1–12 |
| `year` | ja | jaartal |

### Antwoord

Elke dag van de maand, ook de gesloten dagen — zo kun je een kalender vullen zonder gaten.

```json
[
  { "date": "2026-11-01", "status": "disabled" },
  { "date": "2026-11-02", "status": "available" },
  { "date": "2026-11-03", "status": "partially_available" }
]
```

### De statussen

| Status | Betekenis |
|---|---|
| `available` | de hele dag is er ruimte |
| `partially_available` | er is nog beperkt ruimte |
| `unavailable` | vol |
| `disabled` | die dag werkt de garage niet, of hij ligt in het verleden |

Behandel `unavailable` en `disabled` allebei als "niet te kiezen", maar toon ze desgewenst verschillend: vol is iets anders dan gesloten.

### Eerstvolgende open dagen

```
GET /api/{franchiseId}/planner/first-available-dates
```

Dezelfde vorm, maar alleen de eerstvolgende bruikbare dagen in plaats van een hele maand. Een **lege lijst** betekent dat er binnen de doorzochte periode geen ruimte is — dat is een geldig antwoord, geen fout.

---

## Tijdsloten

### Verzoek

```
GET /api/{franchiseId}/planner/available-times?date=2026-11-10
```

### Antwoord

Een platte lijst met tijden, in `HH:MM`:

```json
["08:00","08:15","08:30","08:45","09:00","09:15","09:30"]
```

Bij Carsys en AutoFlex Ten komen de tijden uit de inlevertijden van de garage en niet uit de agenda; de datum is daar dus niet bepalend voor welke tijden je terugkrijgt.

---

## Vervangend vervoer

### Verzoek

```
GET /api/{franchiseId}/planner/replacement-vehicles
```

### Antwoord

```json
[
  {
    "id": "68db4e21-72be-49d2-5e1b-0c73733719c2",
    "name": "Geen",
    "enabled": true,
    "description": "Ik heb geen vervangend vervoer nodig"
  },
  {
    "id": "4bb0814f-1829-4ef2-5075-678be6611f03",
    "name": "Leenauto",
    "enabled": true,
    "description": "Leenauto"
  }
]
```

Let op: **"Geen" is zelf een keuze** in de lijst. Toon hem gewoon mee; de klant kiest actief dat hij niets nodig heeft.

---

## Een afspraak boeken

Het boeken gaat in stappen; elke stap levert wat je nodig hebt voor de volgende.

### 1. Werkzaamheid kiezen

Haal de activiteiten op en laat de klant kiezen. Onthoud het `id`.

### 2. Datum kiezen

Vraag de eerstvolgende datums op, of een maandoverzicht. Geef de gekozen activiteit mee.

### 3. Tijdslot kiezen

Haal de tijdsloten op voor die datum.

### 4. Vervangend vervoer, als de garage dat aanbiedt

Is de lijst leeg, sla deze stap dan over.

### 5. Boeken

```
POST /api/{franchiseId}/planner/appointments
```

Wat je minimaal meestuurt:

- het `id` van de werkzaamheid uit stap 1
- de datum en het tijdslot uit stap 2 en 3
- het kenteken van het voertuig
- klantgegevens: naam, e-mailadres en telefoonnummer

Je krijgt een bevestiging terug met een afspraak-id.

De exacte veldnamen en welke velden verplicht zijn, staan in de [API-referentie](/api/vakgarage), onder Planner.
