{
    "openapi": "3.1.0",
    "info": {
        "title": "morgenklaar.nl API",
        "version": "1.0.0",
        "summary": "Lees de gegevens van je eigen site, van server naar server.",
        "description": "Met een persoonlijke API-sleutel lees je de gegevens van één site: bestellingen, producten, afspraken, artikelen, pagina's en omzet. Deze versie kan alleen lezen.\n\nEen sleutel maak je in je portaal onder API-sleutels, vanaf het pakket Plus. Stuur hem mee als `Authorization: Bearer mk_...`. Gebruik de sleutel alleen op een server: nooit in een app, een webpagina of een openbare plek zoals GitHub. Staat je site niet online (gestopt of gepauzeerd), dan werkt de sleutel niet (403 site_niet_actief) en werkt hij weer zodra de site terug is.\n\nBedragen zijn gehele centen inclusief btw, in euro. Tijden zijn ISO 8601 in Nederlandse tijd. Lijsten gebruiken een cursor: geef `volgende_cursor` uit het antwoord mee als `cursor`.\n\nSynchroniseren: vraag bestellingen of afspraken met `gewijzigd_sinds` en het `gewijzigd_op` van de laatste die je verwerkte. De lijst loopt dan op wijzigingstijd, oudste eerst. Het tijdstip is inclusief: verwerk een bestelling die je al had dus opnieuw zonder dubbel te boeken.\n\nLimieten: per sleutel per minuut en per dag, een lagere limiet voor /omzet en /paginas, en een totaal per site over al zijn sleutels. In elk antwoord staan `X-RateLimit-Limit`, `X-RateLimit-Remaining` en `X-RateLimit-Reset` (de strengste minuutlimiet, Reset is een tijdstip in seconden sinds 1970) en dezelfde met `Day` erin voor de daglimiet. Bij een 429 staat in `Retry-After` hoeveel seconden je moet wachten.\n\nVersiebeleid: velden komen er alleen bij. Iets veranderen of weghalen gebeurt alleen in een nieuwe versie (/v2), met aankondiging. Schrijf je programma dus zo dat het velden negeert die het niet kent.\n\nWebhooks: in je portaal stel je per site in dat we bij een gebeurtenis een POST naar jouw adres sturen. Die berichten staan hieronder bij webhooks, met hoe je de handtekening controleert."
    },
    "servers": [
        {
            "url": "https://morgenklaar.nl/api/v1"
        }
    ],
    "tags": [
        {
            "name": "Algemeen"
        },
        {
            "name": "Site"
        },
        {
            "name": "Bestelling"
        },
        {
            "name": "Product"
        },
        {
            "name": "Afspraak"
        },
        {
            "name": "Artikel"
        },
        {
            "name": "Pagina"
        },
        {
            "name": "Omzet"
        },
        {
            "name": "Webhooks"
        }
    ],
    "security": [
        {
            "bearerAuth": []
        }
    ],
    "paths": {
        "/site": {
            "get": {
                "summary": "De site van je sleutel",
                "description": "De naam en het adres van de site waar deze sleutel bij hoort, wat de sleutel mag en de limieten. Handig om te controleren of je sleutel werkt.",
                "operationId": "leesSite",
                "tags": [
                    "Site"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Site"
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "naam": "Bakkerij Anna",
                                        "domein": "bakkerijanna.nl",
                                        "adres": "https://bakkerijanna.nl",
                                        "pakket": "Plus",
                                        "sleutel": {
                                            "naam": "Boekhoudkoppeling",
                                            "rechten": [
                                                "lezen:bestellingen",
                                                "lezen:omzet"
                                            ],
                                            "verloopt_op": null
                                        },
                                        "inhoud_gewijzigd_op": "2026-10-25T18:40:00+01:00",
                                        "limieten": {
                                            "per_minuut": 60,
                                            "per_dag": 2000,
                                            "per_site_per_minuut": 120,
                                            "per_site_per_dag": 5000,
                                            "zwaar_per_minuut": 20,
                                            "max_per_pagina": 100
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het pakket van de site is te laag voor API-sleutels (pakket_te_laag), of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/bestellingen": {
            "get": {
                "summary": "Bestellingen",
                "description": "De bestellingen van je webshop, nieuwste eerst: betaalde bestellingen, ook als er later iets van terugging. Proefbestellingen staan er niet bij. Met de gegevens van de koper. Met gewijzigd_sinds loopt de lijst op wijzigingstijd, oudste eerst, om te synchroniseren. Vraagt het recht `lezen:bestellingen`.",
                "operationId": "leesBestellingen",
                "tags": [
                    "Bestelling"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/per_pagina"
                    },
                    {
                        "$ref": "#/components/parameters/cursor"
                    },
                    {
                        "$ref": "#/components/parameters/van_betaald"
                    },
                    {
                        "$ref": "#/components/parameters/tot_betaald"
                    },
                    {
                        "$ref": "#/components/parameters/status"
                    },
                    {
                        "$ref": "#/components/parameters/gewijzigd_sinds"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Bestelling"
                                            }
                                        },
                                        "per_pagina": {
                                            "type": "integer"
                                        },
                                        "volgende_cursor": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "description": "Geef dit mee als cursor voor de volgende pagina. null: dit was de laatste."
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "nummer": 42,
                                            "status": "betaald",
                                            "betaald_op": "2026-10-26T14:03:11+01:00",
                                            "aangemaakt_op": "2026-10-26T14:01:40+01:00",
                                            "gewijzigd_op": "2026-10-26T14:03:12+01:00",
                                            "factuurnummer": "0042",
                                            "taal": "nl",
                                            "valuta": "EUR",
                                            "levering": "verzenden",
                                            "afhaaltijd": null,
                                            "regels": [
                                                {
                                                    "product": "broodje",
                                                    "naam": "Broodje",
                                                    "aantal": 2,
                                                    "prijs_centen": 350,
                                                    "btw_procent": 9
                                                }
                                            ],
                                            "subtotaal_centen": 700,
                                            "verzendkosten_centen": 495,
                                            "korting_centen": 70,
                                            "kortingscode": "WELKOM10",
                                            "korting_naam": null,
                                            "korting_verzending_centen": 0,
                                            "totaal_centen": 1125,
                                            "betaald_centen": 1125,
                                            "cadeaubon_bedrag_centen": 0,
                                            "cadeaubon_terug_centen": 0,
                                            "btw": [
                                                {
                                                    "procent": 9,
                                                    "bedrag_centen": 52
                                                },
                                                {
                                                    "procent": 21,
                                                    "bedrag_centen": 86
                                                }
                                            ],
                                            "btw_verlegd": false,
                                            "terugbetaald_centen": 0,
                                            "teruggeboekt_centen": 0,
                                            "herroepen_op": null,
                                            "afgehandeld_op": null,
                                            "volglink": null,
                                            "koper": {
                                                "naam": "Sanne de Vries",
                                                "bedrijfsnaam": null,
                                                "btw_nummer": null,
                                                "email": "sanne@voorbeeld.nl",
                                                "telefoon": "0612345678",
                                                "adres": {
                                                    "straat": "Dorpsstraat 1",
                                                    "postcode": "1234 AB",
                                                    "plaats": "Gouda",
                                                    "land": "NL"
                                                },
                                                "opmerking": null
                                            }
                                        }
                                    ],
                                    "per_pagina": 25,
                                    "volgende_cursor": null
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:bestellingen ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/bestellingen/{nummer}": {
            "get": {
                "summary": "Een bestelling",
                "description": "Eén bestelling op zijn nummer (het nummer van je winkel, zoals in je portaal). Vraagt het recht `lezen:bestellingen`.",
                "operationId": "leesBestellingenNummer",
                "tags": [
                    "Bestelling"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "name": "nummer",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Bestelling"
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "nummer": 42,
                                        "status": "betaald",
                                        "betaald_op": "2026-10-26T14:03:11+01:00",
                                        "aangemaakt_op": "2026-10-26T14:01:40+01:00",
                                        "gewijzigd_op": "2026-10-26T14:03:12+01:00",
                                        "factuurnummer": "0042",
                                        "taal": "nl",
                                        "valuta": "EUR",
                                        "levering": "verzenden",
                                        "afhaaltijd": null,
                                        "regels": [
                                            {
                                                "product": "broodje",
                                                "naam": "Broodje",
                                                "aantal": 2,
                                                "prijs_centen": 350,
                                                "btw_procent": 9
                                            }
                                        ],
                                        "subtotaal_centen": 700,
                                        "verzendkosten_centen": 495,
                                        "korting_centen": 70,
                                        "kortingscode": "WELKOM10",
                                        "korting_naam": null,
                                        "korting_verzending_centen": 0,
                                        "totaal_centen": 1125,
                                        "betaald_centen": 1125,
                                        "cadeaubon_bedrag_centen": 0,
                                        "cadeaubon_terug_centen": 0,
                                        "btw": [
                                            {
                                                "procent": 9,
                                                "bedrag_centen": 52
                                            },
                                            {
                                                "procent": 21,
                                                "bedrag_centen": 86
                                            }
                                        ],
                                        "btw_verlegd": false,
                                        "terugbetaald_centen": 0,
                                        "teruggeboekt_centen": 0,
                                        "herroepen_op": null,
                                        "afgehandeld_op": null,
                                        "volglink": null,
                                        "koper": {
                                            "naam": "Sanne de Vries",
                                            "bedrijfsnaam": null,
                                            "btw_nummer": null,
                                            "email": "sanne@voorbeeld.nl",
                                            "telefoon": "0612345678",
                                            "adres": {
                                                "straat": "Dorpsstraat 1",
                                                "postcode": "1234 AB",
                                                "plaats": "Gouda",
                                                "land": "NL"
                                            },
                                            "opmerking": null
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:bestellingen ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Bestaat niet, of hoort niet bij deze sleutel.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/producten": {
            "get": {
                "summary": "Producten",
                "description": "De producten die op je site te zien zijn, op slug (a-z). In elk product staat de volgorde van je winkel. Vraagt het recht `lezen:producten`.",
                "operationId": "leesProducten",
                "tags": [
                    "Product"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/per_pagina"
                    },
                    {
                        "$ref": "#/components/parameters/cursor"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Product"
                                            }
                                        },
                                        "per_pagina": {
                                            "type": "integer"
                                        },
                                        "volgende_cursor": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "description": "Geef dit mee als cursor voor de volgende pagina. null: dit was de laatste."
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "broodje",
                                            "slug": "broodje",
                                            "volgorde": 1,
                                            "naam": "Broodje",
                                            "omschrijving": "Vers uit de oven",
                                            "categorie": "Brood",
                                            "prijs_centen": 350,
                                            "van_prijs_centen": null,
                                            "btw_procent": 9,
                                            "voorraad": 12,
                                            "uitverkocht": false,
                                            "keuze": null,
                                            "varianten": []
                                        }
                                    ],
                                    "per_pagina": 25,
                                    "volgende_cursor": null
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:producten ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/producten/{slug}": {
            "get": {
                "summary": "Een product",
                "description": "Eén product op zijn slug. Vraagt het recht `lezen:producten`.",
                "operationId": "leesProductenSlug",
                "tags": [
                    "Product"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Product"
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "broodje",
                                        "slug": "broodje",
                                        "volgorde": 1,
                                        "naam": "Broodje",
                                        "omschrijving": "Vers uit de oven",
                                        "categorie": "Brood",
                                        "prijs_centen": 350,
                                        "van_prijs_centen": null,
                                        "btw_procent": 9,
                                        "voorraad": 12,
                                        "uitverkocht": false,
                                        "keuze": null,
                                        "varianten": []
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:producten ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Bestaat niet, of hoort niet bij deze sleutel.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/afspraken": {
            "get": {
                "summary": "Afspraken",
                "description": "De afspraken van je site, op begintijd, oudste eerst. Zonder de gegevens van de bezoeker. Met gewijzigd_sinds loopt de lijst op wijzigingstijd, oudste eerst, om te synchroniseren. Vraagt het recht `lezen:afspraken`.",
                "operationId": "leesAfspraken",
                "tags": [
                    "Afspraak"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/per_pagina"
                    },
                    {
                        "$ref": "#/components/parameters/cursor"
                    },
                    {
                        "$ref": "#/components/parameters/van_begin"
                    },
                    {
                        "$ref": "#/components/parameters/tot_begin"
                    },
                    {
                        "$ref": "#/components/parameters/afspraakstatus"
                    },
                    {
                        "$ref": "#/components/parameters/gewijzigd_sinds"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Afspraak"
                                            }
                                        },
                                        "per_pagina": {
                                            "type": "integer"
                                        },
                                        "volgende_cursor": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "description": "Geef dit mee als cursor voor de volgende pagina. null: dit was de laatste."
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": 17,
                                            "dienst": "Knippen dames",
                                            "dienst_id": "knippen-dames",
                                            "status": "staat",
                                            "begin": "2026-10-30T10:00:00+01:00",
                                            "eind": "2026-10-30T10:45:00+01:00",
                                            "prijs_tekst": "€ 45",
                                            "betalen": "aanbetaling",
                                            "bedrag_centen": 1000,
                                            "betaald_centen": 1000,
                                            "terugbetaald_centen": 0,
                                            "valuta": "EUR",
                                            "taal": "nl",
                                            "afgezegd_op": null,
                                            "aangemaakt_op": "2026-10-26T09:12:00+01:00",
                                            "gewijzigd_op": "2026-10-26T09:13:00+01:00"
                                        }
                                    ],
                                    "per_pagina": 25,
                                    "volgende_cursor": null
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:afspraken ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/afspraken/{id}": {
            "get": {
                "summary": "Een afspraak",
                "description": "Eén afspraak op zijn id. Vraagt het recht `lezen:afspraken`.",
                "operationId": "leesAfsprakenId",
                "tags": [
                    "Afspraak"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Afspraak"
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": 17,
                                        "dienst": "Knippen dames",
                                        "dienst_id": "knippen-dames",
                                        "status": "staat",
                                        "begin": "2026-10-30T10:00:00+01:00",
                                        "eind": "2026-10-30T10:45:00+01:00",
                                        "prijs_tekst": "€ 45",
                                        "betalen": "aanbetaling",
                                        "bedrag_centen": 1000,
                                        "betaald_centen": 1000,
                                        "terugbetaald_centen": 0,
                                        "valuta": "EUR",
                                        "taal": "nl",
                                        "afgezegd_op": null,
                                        "aangemaakt_op": "2026-10-26T09:12:00+01:00",
                                        "gewijzigd_op": "2026-10-26T09:13:00+01:00"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:afspraken ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Bestaat niet, of hoort niet bij deze sleutel.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/artikelen": {
            "get": {
                "summary": "Artikelen",
                "description": "De artikelen op je site, op slug (a-z), met de samenvatting. In elk artikel staan de datum en de volgorde van je site (nieuwste eerst). De hele tekst staat bij één artikel. Vraagt het recht `lezen:artikelen`.",
                "operationId": "leesArtikelen",
                "tags": [
                    "Artikel"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/per_pagina"
                    },
                    {
                        "$ref": "#/components/parameters/cursor"
                    },
                    {
                        "$ref": "#/components/parameters/van_datum"
                    },
                    {
                        "$ref": "#/components/parameters/tot_datum"
                    },
                    {
                        "$ref": "#/components/parameters/categorie"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/ArtikelKort"
                                            }
                                        },
                                        "per_pagina": {
                                            "type": "integer"
                                        },
                                        "volgende_cursor": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "description": "Geef dit mee als cursor voor de volgende pagina. null: dit was de laatste."
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "nieuwe-oven",
                                            "slug": "nieuwe-oven",
                                            "volgorde": 1,
                                            "titel": "Een nieuwe oven",
                                            "datum": "2026-10-01",
                                            "categorie": "Nieuws",
                                            "samenvatting": "Sinds deze week bakken we op hout."
                                        }
                                    ],
                                    "per_pagina": 25,
                                    "volgende_cursor": null
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:artikelen ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/artikelen/{slug}": {
            "get": {
                "summary": "Een artikel",
                "description": "Eén artikel met zijn hele tekst. Vraagt het recht `lezen:artikelen`.",
                "operationId": "leesArtikelenSlug",
                "tags": [
                    "Artikel"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Artikel"
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "nieuwe-oven",
                                        "slug": "nieuwe-oven",
                                        "volgorde": 1,
                                        "titel": "Een nieuwe oven",
                                        "datum": "2026-10-01",
                                        "categorie": "Nieuws",
                                        "samenvatting": "Sinds deze week bakken we op hout.",
                                        "tekst": "Sinds deze week bakken we op hout.\n\n## Waarom\nHet brood wordt er mooier van."
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:artikelen ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Bestaat niet, of hoort niet bij deze sleutel.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/paginas": {
            "get": {
                "summary": "Pagina's",
                "description": "De pagina's van je site zoals de site ze nu laat zien (de voorpagina heet _voorpagina), op pad (a-z). Pagina's met een wachtwoord of voor leden staan er niet bij. Zwaarder dan de rest: hier geldt een lagere limiet. Vraagt het recht `lezen:paginas`.",
                "operationId": "leesPaginas",
                "tags": [
                    "Pagina"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/per_pagina"
                    },
                    {
                        "$ref": "#/components/parameters/cursor"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/PaginaKort"
                                            }
                                        },
                                        "per_pagina": {
                                            "type": "integer"
                                        },
                                        "volgende_cursor": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "description": "Geef dit mee als cursor voor de volgende pagina. null: dit was de laatste."
                                        }
                                    }
                                },
                                "example": {
                                    "data": [
                                        {
                                            "id": "over-ons",
                                            "pad": "over-ons",
                                            "volgorde": 2,
                                            "titel": "Over ons",
                                            "is_voorpagina": false
                                        }
                                    ],
                                    "per_pagina": 25,
                                    "volgende_cursor": null
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:paginas ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/paginas/{pad}": {
            "get": {
                "summary": "Een pagina",
                "description": "De teksten van één pagina, per blok, zoals de site ze nu laat zien. Is de pagina erg lang, dan staat er afgekapt: true. Zwaarder dan de rest: hier geldt een lagere limiet. Vraagt het recht `lezen:paginas`.",
                "operationId": "leesPaginasPad",
                "tags": [
                    "Pagina"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "name": "pad",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Pagina"
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "id": "over-ons",
                                        "pad": "over-ons",
                                        "volgorde": 2,
                                        "titel": "Over ons",
                                        "is_voorpagina": false,
                                        "secties": [
                                            {
                                                "soort": "tekst",
                                                "kop": "Over ons",
                                                "tekst": "Wij bakken sinds 1998."
                                            }
                                        ],
                                        "afgekapt": false
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:paginas ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Bestaat niet, of hoort niet bij deze sleutel.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/omzet": {
            "get": {
                "summary": "Omzet",
                "description": "De omzet van je webshop per dag of per maand, op de dag van betalen. Zonder van en tot: de laatste 30 dagen. Hooguit 366 dagen. Het antwoord kan tot een minuut oud zijn. Zwaarder dan de rest: hier geldt een lagere limiet. Vraagt het recht `lezen:omzet`.",
                "operationId": "leesOmzet",
                "tags": [
                    "Omzet"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/van_omzet"
                    },
                    {
                        "$ref": "#/components/parameters/tot_omzet"
                    },
                    {
                        "$ref": "#/components/parameters/per"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Gelukt.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "$ref": "#/components/schemas/Omzet"
                                        }
                                    }
                                },
                                "example": {
                                    "data": {
                                        "van": "2026-10-25",
                                        "tot": "2026-10-26",
                                        "per": "dag",
                                        "valuta": "EUR",
                                        "totaal": {
                                            "aantal": 3,
                                            "omzet_centen": 4850,
                                            "cadeaubon_gebruikt_centen": 500,
                                            "cadeaubon_verkocht_centen": 0,
                                            "terugbetaald_centen": 0,
                                            "terugbetaald_cadeaubon_centen": 0,
                                            "teruggeboekt_centen": 0,
                                            "betaald_centen": 4350,
                                            "netto_centen": 4850,
                                            "netto_betaald_centen": 4350
                                        },
                                        "perioden": [
                                            {
                                                "periode": "2026-10-26",
                                                "aantal": 3,
                                                "omzet_centen": 4850,
                                                "cadeaubon_gebruikt_centen": 500,
                                                "cadeaubon_verkocht_centen": 0,
                                                "terugbetaald_centen": 0,
                                                "terugbetaald_cadeaubon_centen": 0,
                                                "teruggeboekt_centen": 0,
                                                "betaald_centen": 4350,
                                                "netto_centen": 4850,
                                                "netto_betaald_centen": 4350
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Een waarde in je verzoek klopt niet, bijvoorbeeld een datum of de cursor. Het bericht zegt welke.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "De sleutel ontbreekt of werkt niet (ook als hij is ingetrokken of verlopen).",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Het recht lezen:omzet ontbreekt (scope_ontbreekt), het pakket van de site is te laag (pakket_te_laag) of de site staat niet online (site_niet_actief).",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Een andere methode dan GET. Deze API kan alleen lezen.",
                        "headers": {
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Te veel verzoeken. Wacht zoveel seconden als in Retry-After staat.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            },
                            "X-RateLimit-Limit": {
                                "$ref": "#/components/headers/RateLimitLimit"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/RateLimitRemaining"
                            },
                            "X-RateLimit-Reset": {
                                "$ref": "#/components/headers/RateLimitReset"
                            },
                            "X-RateLimit-Day-Limit": {
                                "$ref": "#/components/headers/RateLimitDayLimit"
                            },
                            "X-RateLimit-Day-Remaining": {
                                "$ref": "#/components/headers/RateLimitDayRemaining"
                            },
                            "X-RateLimit-Day-Reset": {
                                "$ref": "#/components/headers/RateLimitDayReset"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Er ging iets mis aan onze kant. Probeer het later opnieuw.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "We zijn even niet bereikbaar. Wacht zoveel seconden als in Retry-After staat en probeer het opnieuw.",
                        "headers": {
                            "Retry-After": {
                                "$ref": "#/components/headers/RetryAfter"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/openapi.json": {
            "get": {
                "summary": "Deze beschrijving",
                "description": "De OpenAPI-beschrijving van deze API. Openbaar, zonder sleutel. Mag vijf minuten in een cache blijven (Cache-Control: public, max-age=300) en heeft een ETag, dus met If-None-Match krijg je een 304.",
                "operationId": "leesOpenapi",
                "tags": [
                    "Algemeen"
                ],
                "security": [],
                "responses": {
                    "200": {
                        "description": "Dit document.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "304": {
                        "description": "Niet veranderd sinds de ETag die je meestuurde."
                    }
                }
            }
        }
    },
    "webhooks": {
        "bestelling.betaald": {
            "post": {
                "summary": "Bestelling betaald",
                "description": "Zodra een koper een bestelling in je webshop heeft betaald. Met de gegevens van de koper: naam, e-mailadres, telefoonnummer en bezorgadres.",
                "operationId": "webhookBestellingBetaald",
                "tags": [
                    "Webhooks"
                ],
                "security": [],
                "parameters": [
                    {
                        "name": "X-Morgenklaar-Handtekening",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "example": "t=1761487391,v1=5f2b..."
                        },
                        "description": "t is het tijdstip van versturen in seconden sinds 1970, v1 de HMAC-SHA256 (hex) over \"t.body\" met het geheim van je webhook. Reken hem zelf na over de ruwe body, vergelijk in constante tijd en weiger een t die meer dan 300 seconden afwijkt."
                    },
                    {
                        "name": "X-Morgenklaar-Gebeurtenis",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "De gebeurtenis, dezelfde als gebeurtenis in de body."
                    },
                    {
                        "name": "X-Morgenklaar-Levering",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Het id van deze levering, hetzelfde als id in de body en bij elke nieuwe poging. Zag je het al, sla het bericht dan over."
                    },
                    {
                        "name": "X-Morgenklaar-Poging",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 6
                        },
                        "description": "De hoeveelste poging dit is."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/WebhookBestelling"
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Ontvangen. Antwoord binnen 10 seconden; de body van je antwoord lezen we niet."
                    },
                    "default": {
                        "description": "Al het andere (ook een doorverwijzing, of geen antwoord binnen de tijd) is mislukt. We proberen het opnieuw na 1 minuut, 5 minuten, 30 minuten, 2 uur en 6 uur. Lukt er drie dagen lang geen enkele levering, dan zetten we de webhook uit en krijg je een mail."
                    }
                }
            }
        },
        "bestelling.status_gewijzigd": {
            "post": {
                "summary": "Status van een bestelling veranderd",
                "description": "Als een betaalde bestelling helemaal is terugbetaald of door de koper via de bank is teruggeboekt. Ook met de gegevens van de koper.",
                "operationId": "webhookBestellingStatusGewijzigd",
                "tags": [
                    "Webhooks"
                ],
                "security": [],
                "parameters": [
                    {
                        "name": "X-Morgenklaar-Handtekening",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "example": "t=1761487391,v1=5f2b..."
                        },
                        "description": "t is het tijdstip van versturen in seconden sinds 1970, v1 de HMAC-SHA256 (hex) over \"t.body\" met het geheim van je webhook. Reken hem zelf na over de ruwe body, vergelijk in constante tijd en weiger een t die meer dan 300 seconden afwijkt."
                    },
                    {
                        "name": "X-Morgenklaar-Gebeurtenis",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "De gebeurtenis, dezelfde als gebeurtenis in de body."
                    },
                    {
                        "name": "X-Morgenklaar-Levering",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Het id van deze levering, hetzelfde als id in de body en bij elke nieuwe poging. Zag je het al, sla het bericht dan over."
                    },
                    {
                        "name": "X-Morgenklaar-Poging",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 6
                        },
                        "description": "De hoeveelste poging dit is."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/WebhookBestellingStatus"
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Ontvangen. Antwoord binnen 10 seconden; de body van je antwoord lezen we niet."
                    },
                    "default": {
                        "description": "Al het andere (ook een doorverwijzing, of geen antwoord binnen de tijd) is mislukt. We proberen het opnieuw na 1 minuut, 5 minuten, 30 minuten, 2 uur en 6 uur. Lukt er drie dagen lang geen enkele levering, dan zetten we de webhook uit en krijg je een mail."
                    }
                }
            }
        },
        "afspraak.geboekt": {
            "post": {
                "summary": "Afspraak geboekt",
                "description": "Zodra een bezoeker een afspraak heeft gemaakt, en betaald als je vooraf laat betalen. Zonder de gegevens van de bezoeker.",
                "operationId": "webhookAfspraakGeboekt",
                "tags": [
                    "Webhooks"
                ],
                "security": [],
                "parameters": [
                    {
                        "name": "X-Morgenklaar-Handtekening",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "example": "t=1761487391,v1=5f2b..."
                        },
                        "description": "t is het tijdstip van versturen in seconden sinds 1970, v1 de HMAC-SHA256 (hex) over \"t.body\" met het geheim van je webhook. Reken hem zelf na over de ruwe body, vergelijk in constante tijd en weiger een t die meer dan 300 seconden afwijkt."
                    },
                    {
                        "name": "X-Morgenklaar-Gebeurtenis",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "De gebeurtenis, dezelfde als gebeurtenis in de body."
                    },
                    {
                        "name": "X-Morgenklaar-Levering",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Het id van deze levering, hetzelfde als id in de body en bij elke nieuwe poging. Zag je het al, sla het bericht dan over."
                    },
                    {
                        "name": "X-Morgenklaar-Poging",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 6
                        },
                        "description": "De hoeveelste poging dit is."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/WebhookAfspraak"
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Ontvangen. Antwoord binnen 10 seconden; de body van je antwoord lezen we niet."
                    },
                    "default": {
                        "description": "Al het andere (ook een doorverwijzing, of geen antwoord binnen de tijd) is mislukt. We proberen het opnieuw na 1 minuut, 5 minuten, 30 minuten, 2 uur en 6 uur. Lukt er drie dagen lang geen enkele levering, dan zetten we de webhook uit en krijg je een mail."
                    }
                }
            }
        },
        "afspraak.geannuleerd": {
            "post": {
                "summary": "Afspraak afgezegd",
                "description": "Als een afspraak is afgezegd. Zonder de gegevens van de bezoeker.",
                "operationId": "webhookAfspraakGeannuleerd",
                "tags": [
                    "Webhooks"
                ],
                "security": [],
                "parameters": [
                    {
                        "name": "X-Morgenklaar-Handtekening",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "example": "t=1761487391,v1=5f2b..."
                        },
                        "description": "t is het tijdstip van versturen in seconden sinds 1970, v1 de HMAC-SHA256 (hex) over \"t.body\" met het geheim van je webhook. Reken hem zelf na over de ruwe body, vergelijk in constante tijd en weiger een t die meer dan 300 seconden afwijkt."
                    },
                    {
                        "name": "X-Morgenklaar-Gebeurtenis",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "De gebeurtenis, dezelfde als gebeurtenis in de body."
                    },
                    {
                        "name": "X-Morgenklaar-Levering",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Het id van deze levering, hetzelfde als id in de body en bij elke nieuwe poging. Zag je het al, sla het bericht dan over."
                    },
                    {
                        "name": "X-Morgenklaar-Poging",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 6
                        },
                        "description": "De hoeveelste poging dit is."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/WebhookAfspraak"
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Ontvangen. Antwoord binnen 10 seconden; de body van je antwoord lezen we niet."
                    },
                    "default": {
                        "description": "Al het andere (ook een doorverwijzing, of geen antwoord binnen de tijd) is mislukt. We proberen het opnieuw na 1 minuut, 5 minuten, 30 minuten, 2 uur en 6 uur. Lukt er drie dagen lang geen enkele levering, dan zetten we de webhook uit en krijg je een mail."
                    }
                }
            }
        },
        "test": {
            "post": {
                "summary": "Testbericht",
                "description": "Het bericht dat je met de knop Testbericht in je portaal stuurt. Eén poging, zonder herhalen.",
                "operationId": "webhookTest",
                "tags": [
                    "Webhooks"
                ],
                "security": [],
                "parameters": [
                    {
                        "name": "X-Morgenklaar-Handtekening",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "example": "t=1761487391,v1=5f2b..."
                        },
                        "description": "t is het tijdstip van versturen in seconden sinds 1970, v1 de HMAC-SHA256 (hex) over \"t.body\" met het geheim van je webhook. Reken hem zelf na over de ruwe body, vergelijk in constante tijd en weiger een t die meer dan 300 seconden afwijkt."
                    },
                    {
                        "name": "X-Morgenklaar-Gebeurtenis",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "De gebeurtenis, dezelfde als gebeurtenis in de body."
                    },
                    {
                        "name": "X-Morgenklaar-Levering",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Het id van deze levering, hetzelfde als id in de body en bij elke nieuwe poging. Zag je het al, sla het bericht dan over."
                    },
                    {
                        "name": "X-Morgenklaar-Poging",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 6
                        },
                        "description": "De hoeveelste poging dit is."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/WebhookTest"
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Ontvangen. Antwoord binnen 10 seconden; de body van je antwoord lezen we niet."
                    },
                    "default": {
                        "description": "Al het andere (ook een doorverwijzing, of geen antwoord binnen de tijd) is mislukt. We proberen het opnieuw na 1 minuut, 5 minuten, 30 minuten, 2 uur en 6 uur. Lukt er drie dagen lang geen enkele levering, dan zetten we de webhook uit en krijg je een mail."
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "description": "Je persoonlijke sleutel, begint met mk_. Maak hem in je portaal onder API-sleutels."
            }
        },
        "headers": {
            "RateLimitLimit": {
                "description": "Hoeveel verzoeken je per minuut mag doen: de strengste minuutlimiet die voor dit verzoek geldt (van je sleutel, je site of het zwaardere eindpunt).",
                "schema": {
                    "type": "integer"
                }
            },
            "RateLimitRemaining": {
                "description": "Hoeveel verzoeken je nog over hebt in deze minuut.",
                "schema": {
                    "type": "integer"
                }
            },
            "RateLimitReset": {
                "description": "Het tijdstip waarop de minuutlimiet weer ruimte geeft, in seconden sinds 1 januari 1970.",
                "schema": {
                    "type": "integer"
                }
            },
            "RateLimitDayLimit": {
                "description": "Hoeveel verzoeken je per dag mag doen: de strengste daglimiet (van je sleutel of van je site).",
                "schema": {
                    "type": "integer"
                }
            },
            "RateLimitDayRemaining": {
                "description": "Hoeveel verzoeken je nog over hebt vandaag.",
                "schema": {
                    "type": "integer"
                }
            },
            "RateLimitDayReset": {
                "description": "Het tijdstip waarop de daglimiet weer ruimte geeft, in seconden sinds 1 januari 1970.",
                "schema": {
                    "type": "integer"
                }
            },
            "RetryAfter": {
                "description": "Hoeveel seconden je moet wachten voor je het opnieuw probeert.",
                "schema": {
                    "type": "integer"
                }
            }
        },
        "parameters": {
            "per_pagina": {
                "name": "per_pagina",
                "in": "query",
                "required": false,
                "description": "Hoeveel per pagina, 1 tot en met 100. Standaard 25.",
                "schema": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 25
                }
            },
            "cursor": {
                "name": "cursor",
                "in": "query",
                "required": false,
                "description": "De volgende_cursor uit het vorige antwoord, onveranderd. Een cursor hoort bij dezelfde lijst en dezelfde filters.",
                "schema": {
                    "type": "string"
                }
            },
            "van_betaald": {
                "name": "van",
                "in": "query",
                "required": false,
                "description": "Vanaf deze dag, op de dag van betalen (betaald_op), als 2026-10-01 (Nederlandse tijd).",
                "schema": {
                    "type": "string",
                    "format": "date"
                }
            },
            "tot_betaald": {
                "name": "tot",
                "in": "query",
                "required": false,
                "description": "Tot en met deze dag, op de dag van betalen (betaald_op), als 2026-10-31 (Nederlandse tijd).",
                "schema": {
                    "type": "string",
                    "format": "date"
                }
            },
            "van_begin": {
                "name": "van",
                "in": "query",
                "required": false,
                "description": "Vanaf deze dag, op het begin van de afspraak (begin, dus niet op wanneer hij gemaakt is), als 2026-10-01.",
                "schema": {
                    "type": "string",
                    "format": "date"
                }
            },
            "tot_begin": {
                "name": "tot",
                "in": "query",
                "required": false,
                "description": "Tot en met deze dag, op het begin van de afspraak (begin), als 2026-10-31.",
                "schema": {
                    "type": "string",
                    "format": "date"
                }
            },
            "van_datum": {
                "name": "van",
                "in": "query",
                "required": false,
                "description": "Vanaf deze dag, op de datum van het artikel (datum), als 2026-10-01.",
                "schema": {
                    "type": "string",
                    "format": "date"
                }
            },
            "tot_datum": {
                "name": "tot",
                "in": "query",
                "required": false,
                "description": "Tot en met deze dag, op de datum van het artikel (datum), als 2026-10-31.",
                "schema": {
                    "type": "string",
                    "format": "date"
                }
            },
            "van_omzet": {
                "name": "van",
                "in": "query",
                "required": false,
                "description": "De eerste dag van de periode (dag van betalen), als 2026-10-01. Standaard 29 dagen voor tot.",
                "schema": {
                    "type": "string",
                    "format": "date"
                }
            },
            "tot_omzet": {
                "name": "tot",
                "in": "query",
                "required": false,
                "description": "De laatste dag van de periode, als 2026-10-31. Standaard vandaag.",
                "schema": {
                    "type": "string",
                    "format": "date"
                }
            },
            "gewijzigd_sinds": {
                "name": "gewijzigd_sinds",
                "in": "query",
                "required": false,
                "description": "Alleen wat is gewijzigd vanaf dit tijdstip (inclusief), als 2026-10-31T14:03:11+01:00 (schrijf + als %2B) of Z, of een dag als 2026-10-31. Zonder tijdzone geldt Nederlandse tijd. De lijst loopt dan op gewijzigd_op, oudste eerst, en de cursor ook. Gebruik het gewijzigd_op van de laatste die je verwerkte.",
                "schema": {
                    "type": "string",
                    "format": "date-time"
                }
            },
            "status": {
                "name": "status",
                "in": "query",
                "required": false,
                "description": "Alleen bestellingen met deze status.",
                "schema": {
                    "type": "string",
                    "enum": [
                        "betaald",
                        "terugbetaald",
                        "teruggeboekt"
                    ]
                }
            },
            "afspraakstatus": {
                "name": "status",
                "in": "query",
                "required": false,
                "description": "Alleen afspraken met deze status.",
                "schema": {
                    "type": "string",
                    "enum": [
                        "staat",
                        "afgezegd",
                        "botsing"
                    ]
                }
            },
            "categorie": {
                "name": "categorie",
                "in": "query",
                "required": false,
                "description": "Alleen artikelen in deze categorie.",
                "schema": {
                    "type": "string",
                    "maxLength": 40
                }
            },
            "per": {
                "name": "per",
                "in": "query",
                "required": false,
                "description": "Optellen per dag of per maand.",
                "schema": {
                    "type": "string",
                    "enum": [
                        "dag",
                        "maand"
                    ],
                    "default": "dag"
                }
            }
        },
        "schemas": {
            "WebhookBestelling": {
                "type": "object",
                "required": [
                    "id",
                    "gebeurtenis",
                    "aangemaakt_op",
                    "site",
                    "data"
                ],
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "Het id van deze levering (lev_...). Hetzelfde bij elke nieuwe poging: zag je het al, sla het bericht dan over."
                    },
                    "gebeurtenis": {
                        "type": "string",
                        "enum": [
                            "bestelling.betaald",
                            "bestelling.status_gewijzigd",
                            "afspraak.geboekt",
                            "afspraak.geannuleerd",
                            "test"
                        ]
                    },
                    "aangemaakt_op": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Wanneer het gebeurde. Een nieuwe poging verandert dit niet."
                    },
                    "site": {
                        "type": "object",
                        "properties": {
                            "naam": {
                                "type": "string"
                            },
                            "domein": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "data": {
                        "$ref": "#/components/schemas/Bestelling",
                        "description": "Dezelfde velden als de API, zoals het er bij het versturen voor staat. Bij een latere poging kan er dus al iets veranderd zijn; gebeurtenis zegt wat er gebeurde."
                    }
                }
            },
            "WebhookBestellingStatus": {
                "type": "object",
                "required": [
                    "id",
                    "gebeurtenis",
                    "aangemaakt_op",
                    "site",
                    "data"
                ],
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "Het id van deze levering (lev_...). Hetzelfde bij elke nieuwe poging: zag je het al, sla het bericht dan over."
                    },
                    "gebeurtenis": {
                        "type": "string",
                        "enum": [
                            "bestelling.betaald",
                            "bestelling.status_gewijzigd",
                            "afspraak.geboekt",
                            "afspraak.geannuleerd",
                            "test"
                        ]
                    },
                    "aangemaakt_op": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Wanneer het gebeurde. Een nieuwe poging verandert dit niet."
                    },
                    "site": {
                        "type": "object",
                        "properties": {
                            "naam": {
                                "type": "string"
                            },
                            "domein": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "data": {
                        "$ref": "#/components/schemas/Bestelling",
                        "description": "Dezelfde velden als de API, zoals het er bij het versturen voor staat. Bij een latere poging kan er dus al iets veranderd zijn; gebeurtenis zegt wat er gebeurde."
                    },
                    "vorige_status": {
                        "type": "string",
                        "enum": [
                            "betaald",
                            "terugbetaald",
                            "teruggeboekt"
                        ],
                        "description": "De status van voor deze wijziging. De nieuwe staat in data.status."
                    }
                }
            },
            "WebhookAfspraak": {
                "type": "object",
                "required": [
                    "id",
                    "gebeurtenis",
                    "aangemaakt_op",
                    "site",
                    "data"
                ],
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "Het id van deze levering (lev_...). Hetzelfde bij elke nieuwe poging: zag je het al, sla het bericht dan over."
                    },
                    "gebeurtenis": {
                        "type": "string",
                        "enum": [
                            "bestelling.betaald",
                            "bestelling.status_gewijzigd",
                            "afspraak.geboekt",
                            "afspraak.geannuleerd",
                            "test"
                        ]
                    },
                    "aangemaakt_op": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Wanneer het gebeurde. Een nieuwe poging verandert dit niet."
                    },
                    "site": {
                        "type": "object",
                        "properties": {
                            "naam": {
                                "type": "string"
                            },
                            "domein": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "data": {
                        "$ref": "#/components/schemas/Afspraak",
                        "description": "Dezelfde velden als de API, zoals het er bij het versturen voor staat. Bij een latere poging kan er dus al iets veranderd zijn; gebeurtenis zegt wat er gebeurde."
                    }
                }
            },
            "WebhookTest": {
                "type": "object",
                "required": [
                    "id",
                    "gebeurtenis",
                    "aangemaakt_op",
                    "site",
                    "data"
                ],
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "Het id van deze levering (lev_...). Hetzelfde bij elke nieuwe poging: zag je het al, sla het bericht dan over."
                    },
                    "gebeurtenis": {
                        "type": "string",
                        "enum": [
                            "bestelling.betaald",
                            "bestelling.status_gewijzigd",
                            "afspraak.geboekt",
                            "afspraak.geannuleerd",
                            "test"
                        ]
                    },
                    "aangemaakt_op": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Wanneer het gebeurde. Een nieuwe poging verandert dit niet."
                    },
                    "site": {
                        "type": "object",
                        "properties": {
                            "naam": {
                                "type": "string"
                            },
                            "domein": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "data": {
                        "type": "object",
                        "properties": {
                            "bericht": {
                                "type": "string"
                            }
                        },
                        "description": "Dezelfde velden als de API, zoals het er bij het versturen voor staat. Bij een latere poging kan er dus al iets veranderd zijn; gebeurtenis zegt wat er gebeurde."
                    }
                }
            },
            "Fout": {
                "type": "object",
                "required": [
                    "fout"
                ],
                "properties": {
                    "fout": {
                        "type": "object",
                        "required": [
                            "code",
                            "bericht"
                        ],
                        "properties": {
                            "code": {
                                "type": "string",
                                "enum": [
                                    "ongeldig_token",
                                    "pakket_te_laag",
                                    "site_niet_actief",
                                    "scope_ontbreekt",
                                    "niet_gevonden",
                                    "alleen_lezen",
                                    "ongeldige_parameter",
                                    "te_veel_verzoeken",
                                    "serverfout",
                                    "storing"
                                ],
                                "description": "Voor machines; verandert niet."
                            },
                            "bericht": {
                                "type": "string",
                                "description": "Voor mensen, in het Nederlands."
                            }
                        }
                    }
                }
            },
            "Site": {
                "type": "object",
                "properties": {
                    "naam": {
                        "type": "string"
                    },
                    "domein": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "adres": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pakket": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "sleutel": {
                        "type": "object",
                        "properties": {
                            "naam": {
                                "type": "string"
                            },
                            "rechten": {
                                "type": "array",
                                "items": {
                                    "type": "string",
                                    "enum": [
                                        "lezen:bestellingen",
                                        "lezen:producten",
                                        "lezen:afspraken",
                                        "lezen:artikelen",
                                        "lezen:paginas",
                                        "lezen:omzet",
                                        "schrijven:concept"
                                    ]
                                }
                            },
                            "verloopt_op": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            }
                        }
                    },
                    "inhoud_gewijzigd_op": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "description": "Wanneer de inhoud van de site (producten, artikelen, pagina's) voor het laatst is aangepast. Per product, artikel of pagina bewaren we geen wijzigingstijd."
                    },
                    "limieten": {
                        "type": "object",
                        "properties": {
                            "per_minuut": {
                                "type": "integer"
                            },
                            "per_dag": {
                                "type": "integer"
                            },
                            "per_site_per_minuut": {
                                "type": "integer"
                            },
                            "per_site_per_dag": {
                                "type": "integer"
                            },
                            "zwaar_per_minuut": {
                                "type": "integer"
                            },
                            "max_per_pagina": {
                                "type": "integer"
                            }
                        }
                    }
                }
            },
            "Bestelling": {
                "type": "object",
                "properties": {
                    "nummer": {
                        "type": "integer"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "betaald",
                            "terugbetaald",
                            "teruggeboekt"
                        ]
                    },
                    "betaald_op": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "aangemaakt_op": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "gewijzigd_op": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "description": "Wanneer de bestelling voor het laatst veranderde. Hierop werkt het filter gewijzigd_sinds."
                    },
                    "factuurnummer": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Het nummer op de factuur (minstens vier cijfers), of null zolang er geen factuur is."
                    },
                    "taal": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "valuta": {
                        "type": "string",
                        "description": "Altijd EUR."
                    },
                    "levering": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "verzenden, afhalen, digitaal of cadeaubon."
                    },
                    "afhaaltijd": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "regels": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "product": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "naam": {
                                    "type": "string"
                                },
                                "aantal": {
                                    "type": "integer"
                                },
                                "prijs_centen": {
                                    "type": "integer",
                                    "description": "Gehele centen, inclusief btw."
                                },
                                "btw_procent": {
                                    "type": "integer"
                                }
                            }
                        }
                    },
                    "subtotaal_centen": {
                        "type": "integer",
                        "description": "Gehele centen, inclusief btw."
                    },
                    "verzendkosten_centen": {
                        "type": "integer",
                        "description": "Gehele centen, inclusief btw."
                    },
                    "korting_centen": {
                        "type": "integer",
                        "description": "De hele korting, ook het deel op de verzendkosten."
                    },
                    "kortingscode": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "korting_naam": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "De naam van een korting zonder code (een actie)."
                    },
                    "korting_verzending_centen": {
                        "type": "integer",
                        "description": "Het deel van korting_centen dat op de verzendkosten ging."
                    },
                    "totaal_centen": {
                        "type": "integer",
                        "description": "Gehele centen, inclusief btw."
                    },
                    "betaald_centen": {
                        "type": "integer",
                        "description": "Wat de koper echt betaalde: totaal_centen min wat met een cadeaubon is betaald."
                    },
                    "cadeaubon_bedrag_centen": {
                        "type": "integer",
                        "description": "Het deel van het totaal dat met een cadeaubon is betaald."
                    },
                    "cadeaubon_terug_centen": {
                        "type": "integer",
                        "description": "Het deel van een terugbetaling dat op de cadeaubon terugging."
                    },
                    "btw": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "procent": {
                                    "type": "integer"
                                },
                                "bedrag_centen": {
                                    "type": "integer",
                                    "description": "Gehele centen, inclusief btw."
                                }
                            }
                        }
                    },
                    "btw_verlegd": {
                        "type": "boolean"
                    },
                    "terugbetaald_centen": {
                        "type": "integer",
                        "description": "Wat via de betaling is terugbetaald (zonder wat op een cadeaubon terugging, dat staat in cadeaubon_terug_centen)."
                    },
                    "teruggeboekt_centen": {
                        "type": "integer",
                        "description": "Gehele centen, inclusief btw."
                    },
                    "herroepen_op": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "description": "Wanneer de koper de bestelling herriep (bedenktijd), of null."
                    },
                    "afgehandeld_op": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "volglink": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "koper": {
                        "type": "object",
                        "description": "Persoonsgegevens van de koper. Alleen hier in de hele API.",
                        "properties": {
                            "naam": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "bedrijfsnaam": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "btw_nummer": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Het btw-nummer van een zakelijke koper, alleen als de btw is verlegd."
                            },
                            "email": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "telefoon": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "adres": {
                                "type": "object",
                                "properties": {
                                    "straat": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "postcode": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "plaats": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "land": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "opmerking": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    }
                }
            },
            "Product": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "Het vaste id van het product (gelijk aan de slug)."
                    },
                    "slug": {
                        "type": "string"
                    },
                    "volgorde": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "De plek in de volgorde van de winkel, 1 is de eerste."
                    },
                    "naam": {
                        "type": "string"
                    },
                    "omschrijving": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "categorie": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "prijs_centen": {
                        "type": "integer",
                        "description": "Gehele centen, inclusief btw."
                    },
                    "van_prijs_centen": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "btw_procent": {
                        "type": "integer"
                    },
                    "voorraad": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "null: de voorraad wordt niet bijgehouden."
                    },
                    "uitverkocht": {
                        "type": "boolean"
                    },
                    "keuze": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "varianten": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "sleutel": {
                                    "type": "string"
                                },
                                "naam": {
                                    "type": "string"
                                },
                                "prijs_centen": {
                                    "type": "integer",
                                    "description": "Gehele centen, inclusief btw."
                                },
                                "voorraad": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "te_koop": {
                                    "type": "boolean"
                                }
                            }
                        }
                    }
                }
            },
            "Afspraak": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "dienst": {
                        "type": "string"
                    },
                    "dienst_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "De naam van de dienst als slug. Een afspraak bewaart geen nummer van de dienst; dit verandert als de klant de dienst hernoemt."
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "staat",
                            "afgezegd",
                            "botsing"
                        ]
                    },
                    "begin": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "eind": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "prijs_tekst": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "De prijs zoals de klant hem typte (voor mensen). Het bedrag voor machines staat in bedrag_centen."
                    },
                    "betalen": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "bedrag_centen": {
                        "type": "integer",
                        "description": "Het bedrag dat de bezoeker vooraf moest betalen; 0 als er niet vooraf betaald wordt."
                    },
                    "betaald_centen": {
                        "type": "integer",
                        "description": "Gehele centen, inclusief btw."
                    },
                    "terugbetaald_centen": {
                        "type": "integer",
                        "description": "Gehele centen, inclusief btw."
                    },
                    "valuta": {
                        "type": "string",
                        "description": "Altijd EUR."
                    },
                    "taal": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "afgezegd_op": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "aangemaakt_op": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "gewijzigd_op": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "description": "Wanneer de afspraak voor het laatst veranderde. Hierop werkt het filter gewijzigd_sinds."
                    }
                }
            },
            "ArtikelKort": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "slug": {
                        "type": "string"
                    },
                    "volgorde": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "titel": {
                        "type": "string"
                    },
                    "datum": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "categorie": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "samenvatting": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "Artikel": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "slug": {
                        "type": "string"
                    },
                    "volgorde": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "titel": {
                        "type": "string"
                    },
                    "datum": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "categorie": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "samenvatting": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tekst": {
                        "type": "string",
                        "description": "De hele tekst; een regel met ## ervoor is een tussenkop."
                    }
                }
            },
            "PaginaKort": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "pad": {
                        "type": "string"
                    },
                    "volgorde": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "titel": {
                        "type": "string"
                    },
                    "is_voorpagina": {
                        "type": "boolean"
                    }
                }
            },
            "Pagina": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "pad": {
                        "type": "string"
                    },
                    "volgorde": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "titel": {
                        "type": "string"
                    },
                    "is_voorpagina": {
                        "type": "boolean"
                    },
                    "secties": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "description": "Per blok de teksten die erin staan (label, kop, tekst, knop en meer) en de rijen in items.",
                            "additionalProperties": true
                        }
                    },
                    "afgekapt": {
                        "type": "boolean",
                        "description": "true: de pagina is langer dan een antwoord mag zijn en de rest van de blokken (of rijen) is weggelaten."
                    }
                }
            },
            "Omzet": {
                "type": "object",
                "properties": {
                    "van": {
                        "type": "string",
                        "format": "date"
                    },
                    "tot": {
                        "type": "string",
                        "format": "date"
                    },
                    "per": {
                        "type": "string",
                        "enum": [
                            "dag",
                            "maand"
                        ]
                    },
                    "valuta": {
                        "type": "string"
                    },
                    "totaal": {
                        "type": "object",
                        "properties": {
                            "aantal": {
                                "type": "integer"
                            },
                            "omzet_centen": {
                                "type": "integer",
                                "description": "Het totaal van de betaalde bestellingen, zoals in het portaal: inclusief wat met een cadeaubon is betaald. De verkoop van een cadeaubon telt zelf ook mee."
                            },
                            "cadeaubon_gebruikt_centen": {
                                "type": "integer",
                                "description": "Het deel van omzet_centen dat met een cadeaubon is betaald."
                            },
                            "cadeaubon_verkocht_centen": {
                                "type": "integer",
                                "description": "Het deel van omzet_centen dat uit de verkoop van cadeaubonnen komt."
                            },
                            "terugbetaald_centen": {
                                "type": "integer",
                                "description": "Alles wat terugging op de dag van terugbetalen, ook wat op een cadeaubon terugging."
                            },
                            "terugbetaald_cadeaubon_centen": {
                                "type": "integer",
                                "description": "Het deel van terugbetaald_centen dat op een cadeaubon terugging."
                            },
                            "teruggeboekt_centen": {
                                "type": "integer",
                                "description": "Gehele centen, inclusief btw."
                            },
                            "betaald_centen": {
                                "type": "integer",
                                "description": "omzet_centen min wat met een cadeaubon is betaald: wat de kopers echt betaalden."
                            },
                            "netto_centen": {
                                "type": "integer",
                                "description": "omzet_centen min terugbetaald_centen en teruggeboekt_centen, zoals in het portaal."
                            },
                            "netto_betaald_centen": {
                                "type": "integer",
                                "description": "betaald_centen min wat echt terugging (niet wat op een cadeaubon terugging) en wat teruggeboekt is. Telt geen cadeaubon dubbel."
                            }
                        }
                    },
                    "perioden": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "periode": {
                                    "type": "string"
                                },
                                "aantal": {
                                    "type": "integer"
                                },
                                "omzet_centen": {
                                    "type": "integer",
                                    "description": "Het totaal van de betaalde bestellingen, zoals in het portaal: inclusief wat met een cadeaubon is betaald. De verkoop van een cadeaubon telt zelf ook mee."
                                },
                                "cadeaubon_gebruikt_centen": {
                                    "type": "integer",
                                    "description": "Het deel van omzet_centen dat met een cadeaubon is betaald."
                                },
                                "cadeaubon_verkocht_centen": {
                                    "type": "integer",
                                    "description": "Het deel van omzet_centen dat uit de verkoop van cadeaubonnen komt."
                                },
                                "terugbetaald_centen": {
                                    "type": "integer",
                                    "description": "Alles wat terugging op de dag van terugbetalen, ook wat op een cadeaubon terugging."
                                },
                                "terugbetaald_cadeaubon_centen": {
                                    "type": "integer",
                                    "description": "Het deel van terugbetaald_centen dat op een cadeaubon terugging."
                                },
                                "teruggeboekt_centen": {
                                    "type": "integer",
                                    "description": "Gehele centen, inclusief btw."
                                },
                                "betaald_centen": {
                                    "type": "integer",
                                    "description": "omzet_centen min wat met een cadeaubon is betaald: wat de kopers echt betaalden."
                                },
                                "netto_centen": {
                                    "type": "integer",
                                    "description": "omzet_centen min terugbetaald_centen en teruggeboekt_centen, zoals in het portaal."
                                },
                                "netto_betaald_centen": {
                                    "type": "integer",
                                    "description": "betaald_centen min wat echt terugging (niet wat op een cadeaubon terugging) en wat teruggeboekt is. Telt geen cadeaubon dubbel."
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}