---
title: "Vestigingen"
icon: "map"
visibility: "public"
---

Een vestiging is een aangesloten garage binnen het Vakgarage-netwerk. Via deze endpoints haal je het volledige netwerk op, één specifieke garage, of de garage die het dichtst bij een plaats ligt.

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

---

## Endpoints

| Methode | Pad | Waarvoor |
|---|---|---|
| `GET` | `/api/franchises` | alle vestigingen |
| `GET` | `/api/franchises/{franchiseId}` | één vestiging |
| `GET` | `/api/franchises/search/closest` | dichtstbijzijnde vestiging bij een plaats |

Het `franchiseId` dat je hier terugkrijgt, gebruik je bij alle andere endpoints met een `{franchiseId}` in het pad. Zie [Client types](/apiportaal/api/client-types) voor wie welke vestiging mag opvragen.

---

## Alle vestigingen

### Verzoek

```
GET /api/franchises
```

### Antwoord

Een platte lijst met alle vestigingen, gesorteerd op naam, zonder paginering.

Het voorbeeld hieronder is ingekort tot twee dagen; in het echte antwoord staan alle dagen van de week per afdeling.

```json
[
  {
    "franchiseId": "123456",
    "name": "Vakgarage Voorbeeld",
    "streetName": "Dorpsstraat",
    "streetNumber": "1A",
    "postalCode": "1234 AB",
    "city": "Voorbeeldstad",
    "long": "5.12345600",
    "lat": "52.12345600",
    "phone": "(012) 345 67 89",
    "email": "info@vakgaragevoorbeeld.nl",
    "website": "www.vakgaragevoorbeeld.nl",
    "image": "https://cdn.example.com/vestigingen/123456.jpg",
    "openingHours": [
      {
        "department": "Algemeen",
        "days": [
          { "weekday": 1, "opens_at": "08:00", "closes_at": "20:00", "remarks": null },
          { "weekday": 7, "opens_at": null, "closes_at": null, "remarks": null }
        ]
      }
    ]
  }
]
```

### Velden

| Veld | Type | Beschrijving |
|---|---|---|
| `franchiseId` | string | het klantnummer; hiermee spreek je deze vestiging aan |
| `name` | string | naam van de garage |
| `streetName` · `streetNumber` | string | straat en huisnummer |
| `postalCode` · `city` | string | postcode en plaats |
| `long` · `lat` | string | coördinaten, als tekst met acht decimalen |
| `phone` | string | telefoonnummer, inclusief opmaak |
| `email` | string | algemeen e-mailadres van de garage |
| `website` | string | zonder protocol, bijvoorbeeld `www.vakgaragevoorbeeld.nl` |
| `image` | string of `null` | foto van de vestiging |
| `openingHours` | array | de openingstijden per afdeling, zie hieronder |

Coördinaten komen als **string** terug, niet als getal. Reken ze om voordat je ermee rekent.

---

## Openingstijden

`openingHours` is een lijst met één blok per afdeling. Elk blok heeft een `department` en een `days` met de zeven dagen van de week.

```json
{
  "department": "Werkplaats",
  "days": [
    { "weekday": 1, "opens_at": "08:00", "closes_at": "17:30", "remarks": null },
    { "weekday": 6, "opens_at": "08:30", "closes_at": "12:00", "remarks": "zomer" },
    { "weekday": 7, "opens_at": null, "closes_at": null, "remarks": null }
  ]
}
```

| Veld | Type | Beschrijving |
|---|---|---|
| `department` | string | de afdeling, bijvoorbeeld `Werkplaats`, `Showroom` of `Algemeen` |
| `weekday` | integer | **1 is maandag, 7 is zondag** |
| `opens_at` · `closes_at` | string of `null` | tijd als `HH:MM`; allebei `null` betekent gesloten |
| `remarks` | string of `null` | een losse opmerking van de garage bij die dag |

### Waar je op moet letten

De afdelingen verschillen per garage. De ene heeft één blok `Algemeen`, de andere splitst in `Werkplaats` en `Showroom`, en er komen ook namen voor als `Receptie`, `Wasstraat` of `Verhuur`. Ga er dus niet van uit dat een bepaalde afdeling bestaat: loop de lijst af in plaats van te zoeken op naam.

Gesloten is `opens_at` en `closes_at` allebei `null`, niet een lege tekst. Een dag ontbreekt niet in de lijst; hij staat er met lege tijden in.

---

## Eén vestiging

### Verzoek

```
GET /api/franchises/123456
```

### Antwoord

Hetzelfde object als in de lijst, hier met alle dagen.

```json
{
  "franchiseId": "123456",
  "name": "Vakgarage Voorbeeld",
  "streetName": "Dorpsstraat",
  "streetNumber": "1A",
  "postalCode": "1234 AB",
  "city": "Voorbeeldstad",
  "long": "5.12345600",
  "lat": "52.12345600",
  "phone": "(012) 345 67 89",
  "email": "info@vakgaragevoorbeeld.nl",
  "website": "www.vakgaragevoorbeeld.nl",
  "image": "https://cdn.example.com/vestigingen/123456.jpg",
  "openingHours": [
    {
      "department": "Algemeen",
      "days": [
        { "weekday": 1, "opens_at": "08:00", "closes_at": "20:00", "remarks": null },
        { "weekday": 2, "opens_at": "08:00", "closes_at": "18:00", "remarks": null },
        { "weekday": 3, "opens_at": "08:00", "closes_at": "20:00", "remarks": null },
        { "weekday": 4, "opens_at": "08:00", "closes_at": "20:00", "remarks": null },
        { "weekday": 5, "opens_at": "08:00", "closes_at": "18:00", "remarks": null },
        { "weekday": 6, "opens_at": "09:00", "closes_at": "12:00", "remarks": null },
        { "weekday": 7, "opens_at": null, "closes_at": null, "remarks": null }
      ]
    }
  ]
}
```

### Onbekend klantnummer

```
HTTP 404 Not Found
```

```json
{
  "message": "Franchise not found"
}
```

---

## Dichtstbijzijnde vestiging

Handig voor een "vind een garage bij mij in de buurt"-functie. Je geeft een zoekterm op — een plaatsnaam, adres of postcode — en krijgt alle vestigingen terug, gesorteerd op afstand.

### Verzoek

```
GET /api/franchises/search/closest?query=Andersstad
```

| Parameter | Verplicht | Beschrijving |
|---|---|---|
| `query` | ja | plaatsnaam, adres of postcode |

### Antwoord

Dezelfde velden als hierboven, met `distance` erbij. De lijst is oplopend gesorteerd, dus het eerste element is de dichtstbijzijnde. Ook hier zijn de openingstijden in het voorbeeld ingekort.

```json
[
  {
    "franchiseId": "234567",
    "name": "Vakgarage Tweede Voorbeeld",
    "streetName": "Stationsweg",
    "streetNumber": "12",
    "postalCode": "2345 CD",
    "city": "Andersstad",
    "long": "6.12345600",
    "lat": "53.12345600",
    "phone": "(023) 456 78 90",
    "email": "info@vakgaragetweedevoorbeeld.nl",
    "website": "www.vakgaragetweedevoorbeeld.nl",
    "image": "https://cdn.example.com/vestigingen/234567.jpg",
    "openingHours": [
      {
        "department": "Receptie",
        "days": [
          { "weekday": 1, "opens_at": "08:15", "closes_at": "17:30", "remarks": null }
        ]
      }
    ],
    "distance": 3.8474110595172726
  }
]
```

`distance` is de hemelsbrede afstand in **kilometers** — niet de rijafstand.

### Let op

Levert de zoekterm geen locatie op, dan krijg je een `500` met de melding dat de geocoding mislukte. Vang dat af en toon de volledige lijst als terugval.

---

## Foto en openingstijden

- **`image` kan `null` zijn.** Niet elke vestiging heeft een foto. Toon een terugval in plaats van een leeg vlak.
- **De url wijst naar een externe opslag.** Hij kan wijzigen; laad hem met een `onerror`-terugval en sla hem niet voor langere tijd op.
- **`openingHours` kan een lege lijst zijn.** Niet van elke vestiging zijn de tijden bekend.

Beide worden dagelijks bijgewerkt. Een wijziging is dus op zijn vroegst de volgende dag zichtbaar.
