{
    "openapi": "3.1.0",
    "info": {
        "title": "MiniPol API",
        "version": "1.0.0",
        "description": "De API van MiniPol: gesprekken, stellingen, antwoorden, moderatie, het logboek (events) en de standaardexport voor de math server.\n\nAlle requests en responses zijn JSON. Fouten komen terug als `{ \"error\": \"...\" }` met een passende statuscode.\n\nEndpoints met een slotje zijn alleen voor de beheeromgeving: log in met `POST /sessie` en vul het token in bij **Authorize**. Wat een account mag, hangt af van zijn rollen: superbeheerder, of gespreksbeheerder of moderator in het team van een gesprek (zie `Rol`). Direct na installatie log je in met admin/admin, alleen om de eerste superbeheerder te maken (`POST /installatie`). Een token blijft geldig zolang het gebruikt wordt: het verloopt na een uur zonder gebruik, en na 12 uur altijd."
    },
    "servers": [
        {
            "url": "https://api.minipol.nl"
        }
    ],
    "security": [
        []
    ],
    "tags": [
        {
            "name": "Gesprekken",
            "description": "Een gesprek met zijn stellingen; aanmaken en aanpassen alleen voor beheerders"
        },
        {
            "name": "Stellingen",
            "description": "Stellingen die deelnemers toevoegen"
        },
        {
            "name": "Antwoorden",
            "description": "Eens, neutraal of oneens op een stelling"
        },
        {
            "name": "Moderatie",
            "description": "Alleen voor beheerders"
        },
        {
            "name": "Events",
            "description": "Wat er in een gesprek gebeurde; alleen voor beheerders"
        },
        {
            "name": "Export",
            "description": "Voor de math server en andere tools"
        },
        {
            "name": "Docs",
            "description": "Deze documentatie"
        },
        {
            "name": "Sessie",
            "description": "Inloggen in de beheeromgeving"
        },
        {
            "name": "Beheer",
            "description": "Accounts, rollen, teams en uitnodigingen; zie de beschrijving van de rollen bij `Rol`"
        }
    ],
    "paths": {
        "/gesprekken": {
            "get": {
                "tags": [
                    "Gesprekken"
                ],
                "summary": "Alle gesprekken",
                "operationId": "getGesprekken",
                "responses": {
                    "200": {
                        "description": "De gesprekken, op volgorde van aanmaken",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "gesprekken"
                                    ],
                                    "properties": {
                                        "gesprekken": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Gesprek"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                "description": "Zonder token: de gesprekken waar deelnemers aan mee kunnen doen (status `actief`). Met een token: de gesprekken voor de beheeromgeving, elk met de `rol` van het account: een superbeheerder ziet ze allemaal, ook gepauzeerde en beëindigde; de anderen de gesprekken van hun team.",
                "security": [
                    [],
                    {
                        "bearer": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Gesprekken"
                ],
                "summary": "Gesprek aanmaken (superbeheerders)",
                "operationId": "postGesprek",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Gesprek"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Het nieuwe gesprek",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Gesprek"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    }
                },
                "description": "Het team komt erbij met uitnodigingen (`POST /uitnodigingen`)."
            }
        },
        "/gesprekken/{id}": {
            "parameters": [
                {
                    "name": "id",
                    "in": "path",
                    "required": true,
                    "schema": {
                        "type": "string"
                    }
                }
            ],
            "get": {
                "tags": [
                    "Gesprekken"
                ],
                "summary": "Eén gesprek met zijn zichtbare stellingen",
                "description": "De stellingen komen in willekeurige volgorde; alleen de zichtbare, zie Moderatie. Een gepauzeerd of beëindigd gesprek (`status` `opgeschort` of `beeindigd`) heeft geen stellingen: de app toont dan een melding.",
                "operationId": "getGesprek",
                "responses": {
                    "200": {
                        "description": "Het gesprek",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Gesprek"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    }
                }
            },
            "put": {
                "tags": [
                    "Gesprekken"
                ],
                "summary": "Gesprek aanpassen (gespreksbeheerders)",
                "description": "Zonder `moderatie` blijft die gelijk.",
                "operationId": "putGesprek",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Gesprek"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Het aangepaste gesprek",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Gesprek"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    }
                }
            }
        },
        "/stellingen": {
            "get": {
                "tags": [
                    "Stellingen"
                ],
                "summary": "De stellingen die één deelnemer heeft toegevoegd",
                "description": "Met hun moderatiestatus en hoe ze beantwoord zijn.",
                "operationId": "getMijnStellingen",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/GesprekId"
                    },
                    {
                        "name": "deelnemer_id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9-]{1,64}$"
                        },
                        "description": "Het id van de deelnemer"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "De stellingen, op volgorde van toevoegen",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "stellingen"
                                    ],
                                    "properties": {
                                        "stellingen": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Stelling"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    }
                }
            },
            "post": {
                "tags": [
                    "Stellingen"
                ],
                "summary": "Stelling toevoegen",
                "description": "Witruimte wordt één spatie. Of de stelling direct zichtbaar is, hangt af van de moderatie van het gesprek. Niet als het gesprek gepauzeerd of beëindigd is (409).",
                "operationId": "postStelling",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "description": "Een stelling, met gesprek_id en deelnemer_id",
                                "allOf": [
                                    {
                                        "$ref": "#/components/schemas/Stelling"
                                    },
                                    {
                                        "required": [
                                            "gesprek_id",
                                            "deelnemer_id",
                                            "tekst"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "De nieuwe stelling",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Stelling"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflict"
                    }
                }
            }
        },
        "/antwoorden": {
            "get": {
                "tags": [
                    "Antwoorden"
                ],
                "summary": "De antwoorden van één deelnemer, of van iedereen als matrix",
                "description": "Met `deelnemer_id`: de antwoorden van die deelnemer. Zonder: de matrix, per deelnemer anoniem, zoals in de export.",
                "operationId": "getAntwoorden",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/GesprekId"
                    },
                    {
                        "name": "deelnemer_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9-]{1,64}$"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "De antwoorden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "oneOf": [
                                        {
                                            "title": "Van één deelnemer",
                                            "type": "object",
                                            "required": [
                                                "antwoorden"
                                            ],
                                            "properties": {
                                                "antwoorden": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/Antwoord"
                                                    }
                                                }
                                            }
                                        },
                                        {
                                            "title": "Matrix",
                                            "type": "object",
                                            "required": [
                                                "gesprek_id",
                                                "deelnemers"
                                            ],
                                            "properties": {
                                                "gesprek_id": {
                                                    "type": "string"
                                                },
                                                "deelnemers": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/Deelnemer"
                                                    }
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    }
                }
            },
            "post": {
                "tags": [
                    "Antwoorden"
                ],
                "summary": "Antwoord geven",
                "description": "Alleen op zichtbare stellingen. Opnieuw antwoorden mag; het laatste antwoord telt. Niet als het gesprek gepauzeerd of beëindigd is (409).",
                "operationId": "postAntwoord",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "description": "Een antwoord, met alle velden",
                                "allOf": [
                                    {
                                        "$ref": "#/components/schemas/Antwoord"
                                    },
                                    {
                                        "required": [
                                            "gesprek_id",
                                            "deelnemer_id",
                                            "stelling_id",
                                            "waarde"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Het opgeslagen antwoord",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Antwoord"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "404": {
                        "description": "Gesprek niet gevonden, of de stelling hoort er niet bij of is niet zichtbaar",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflict"
                    }
                }
            }
        },
        "/beoordelingen": {
            "get": {
                "tags": [
                    "Moderatie"
                ],
                "summary": "Alle stellingen van een gesprek met hun moderatiestatus",
                "description": "Ook de onzichtbare, op volgorde van toevoegen, zonder wie ze toevoegde. Alleen voor het team van het gesprek (gespreksbeheerders en moderators).",
                "operationId": "getBeoordelingen",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/GesprekId"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "De stellingen",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "stellingen"
                                    ],
                                    "properties": {
                                        "stellingen": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Stelling"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    }
                }
            },
            "post": {
                "tags": [
                    "Moderatie"
                ],
                "summary": "Stelling goedkeuren of afkeuren",
                "description": "Bij `afgekeurd` is een reden verplicht; die ziet de indiener. Een beoordeling is altijd te herzien: de laatste telt. Alleen voor het team van het gesprek (gespreksbeheerders en moderators).",
                "operationId": "postBeoordeling",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "description": "Een beoordeling, met gesprek_id",
                                "allOf": [
                                    {
                                        "$ref": "#/components/schemas/Beoordeling"
                                    },
                                    {
                                        "required": [
                                            "gesprek_id",
                                            "stelling_id",
                                            "beoordeling"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "De stelling met zijn nieuwe status",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Stelling"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    }
                }
            }
        },
        "/events": {
            "get": {
                "tags": [
                    "Events"
                ],
                "summary": "Wat er in een gesprek gebeurde, nieuwste eerst",
                "description": "De events van het gesprek: aangemaakt en aangepast, stellingen toegevoegd, goedgekeurd en afgekeurd, en antwoorden. Deelnemers staan erin met hun nummer uit de matrix, nooit met hun id. Events over een stelling hebben de `tekst` ervan. Oudere events haal je op met `voor`: het id van het oudste event dat je al hebt. Alleen voor het team van het gesprek (gespreksbeheerders en moderators).",
                "operationId": "getEvents",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/GesprekId"
                    },
                    {
                        "name": "voor",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Alleen events van vóór het event met dit id"
                    },
                    {
                        "name": "limiet",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 1000,
                            "default": 100
                        },
                        "description": "Hoeveel events hooguit"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "De events",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "events",
                                        "meer"
                                    ],
                                    "properties": {
                                        "events": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Event"
                                            }
                                        },
                                        "meer": {
                                            "type": "boolean",
                                            "description": "Of er oudere events zijn"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    }
                }
            }
        },
        "/export": {
            "get": {
                "tags": [
                    "Export"
                ],
                "summary": "De standaardexport van een gesprek",
                "description": "Anoniem: alleen zichtbare stellingen, deelnemers genummerd zoals in de matrix, per deelnemer het laatste antwoord.",
                "operationId": "getExport",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/GesprekId"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "De export",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Export"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    }
                }
            }
        },
        "/installatie": {
            "post": {
                "tags": [
                    "Beheer"
                ],
                "summary": "De eerste superbeheerder maken",
                "description": "Alleen met de login van admin/admin, direct na installatie. Daarna werkt admin/admin niet meer, en ben je ingelogd als de nieuwe superbeheerder.",
                "operationId": "postInstallatie",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/NieuwAccount"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "De superbeheerder, ingelogd",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Sessie"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflict"
                    }
                }
            }
        },
        "/uitnodigingen": {
            "post": {
                "tags": [
                    "Beheer"
                ],
                "summary": "Iemand uitnodigen",
                "description": "Superbeheerders nodigen uit voor elke rol; gespreksbeheerders voor het team van hun gesprek. Je krijgt een `token`: stuur de link `<admin>/#/uitnodiging/<token>` zelf door. Hij is 48 uur geldig en werkt één keer.",
                "operationId": "postUitnodiging",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "allOf": [
                                    {
                                        "$ref": "#/components/schemas/Uitnodiging"
                                    },
                                    {
                                        "required": [
                                            "rol"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "De uitnodiging, met het token",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Uitnodiging"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    }
                }
            }
        },
        "/uitnodigingen/{token}": {
            "parameters": [
                {
                    "name": "token",
                    "in": "path",
                    "required": true,
                    "schema": {
                        "type": "string"
                    }
                }
            ],
            "get": {
                "tags": [
                    "Beheer"
                ],
                "summary": "Waarvoor een uitnodiging is",
                "operationId": "getUitnodiging",
                "responses": {
                    "200": {
                        "description": "De rol, en het gesprek",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Uitnodiging"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    }
                }
            },
            "post": {
                "tags": [
                    "Beheer"
                ],
                "summary": "Een uitnodiging aannemen",
                "description": "Ingelogd: voor dat account (geen body nodig). Anders voor een nieuw account met deze gegevens, dat meteen is ingelogd (`token` en `verloopt`).",
                "operationId": "postUitnodigingAannemen",
                "security": [
                    [],
                    {
                        "bearer": []
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/NieuwAccount"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Het account met zijn nieuwe rol",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Sessie"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflict"
                    }
                }
            }
        },
        "/team": {
            "get": {
                "tags": [
                    "Beheer"
                ],
                "summary": "Het team van een gesprek",
                "description": "Voor superbeheerders en de gespreksbeheerders van het gesprek; ook opgeschorte en verwijderde leden.",
                "operationId": "getTeam",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/GesprekId"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "De leden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "leden"
                                    ],
                                    "properties": {
                                        "leden": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Lid"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    }
                }
            },
            "post": {
                "tags": [
                    "Beheer"
                ],
                "summary": "Een lid opschorten, herstellen of verwijderen",
                "description": "Voor superbeheerders en de gespreksbeheerders van het gesprek, met een reden bij opschorten en verwijderen. Een gespreksbeheerder verandert zijn eigen status niet (409); een superbeheerder wel, bijvoorbeeld om zichzelf te herstellen. Nieuwe leden komen erbij met een uitnodiging.",
                "operationId": "postTeam",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "allOf": [
                                    {
                                        "$ref": "#/components/schemas/Statuswijziging"
                                    },
                                    {
                                        "type": "object",
                                        "required": [
                                            "gesprek_id",
                                            "account_id"
                                        ],
                                        "properties": {
                                            "gesprek_id": {
                                                "type": "string"
                                            },
                                            "account_id": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Het lid",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Lid"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflict"
                    }
                }
            }
        },
        "/superbeheerders": {
            "get": {
                "tags": [
                    "Beheer"
                ],
                "summary": "De superbeheerders",
                "description": "Alleen voor superbeheerders; ook opgeschorte en verwijderde.",
                "operationId": "getSuperbeheerders",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "De superbeheerders",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "superbeheerders"
                                    ],
                                    "properties": {
                                        "superbeheerders": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Superbeheerder"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    }
                }
            },
            "post": {
                "tags": [
                    "Beheer"
                ],
                "summary": "Een superbeheerder opschorten, herstellen of verwijderen",
                "description": "Alleen voor superbeheerders, met een reden bij opschorten en verwijderen. Je eigen status verander je niet (409), zodat er altijd een superbeheerder over blijft.",
                "operationId": "postSuperbeheerder",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "allOf": [
                                    {
                                        "$ref": "#/components/schemas/Statuswijziging"
                                    },
                                    {
                                        "type": "object",
                                        "required": [
                                            "account_id"
                                        ],
                                        "properties": {
                                            "account_id": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "De superbeheerder",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Superbeheerder"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflict"
                    }
                }
            }
        },
        "/gespreksstatus": {
            "post": {
                "tags": [
                    "Beheer"
                ],
                "summary": "Een gesprek pauzeren, beëindigen of weer openen",
                "description": "Alleen voor superbeheerders, met een reden bij pauzeren (`opgeschort`) en beëindigen (`beeindigd`). Deelnemers zien dan een melding: dat het gesprek gepauzeerd is, of dat het voorbij is. Er kunnen geen antwoorden of stellingen bij, en het team kan er niet bij. `actief` opent het weer. Een gesprek wordt nooit verwijderd.",
                "operationId": "postGespreksstatus",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "allOf": [
                                    {
                                        "$ref": "#/components/schemas/Statuswijziging"
                                    },
                                    {
                                        "type": "object",
                                        "required": [
                                            "gesprek_id"
                                        ],
                                        "properties": {
                                            "gesprek_id": {
                                                "type": "string"
                                            },
                                            "status": {
                                                "$ref": "#/components/schemas/Gespreksstatus"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Het gesprek",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Gesprek"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "$ref": "#/components/responses/NietIngelogd"
                    },
                    "403": {
                        "$ref": "#/components/responses/GeenToegang"
                    },
                    "404": {
                        "$ref": "#/components/responses/NietGevonden"
                    }
                }
            }
        },
        "/sessie": {
            "get": {
                "tags": [
                    "Sessie"
                ],
                "summary": "De ingelogde beheerder",
                "description": "`account` is het account van het token, of null. `installatie` is true voor de login met admin/admin direct na installatie. Een geldig token wordt verlengd.",
                "operationId": "getSessie",
                "security": [
                    {
                        "bearer": []
                    },
                    []
                ],
                "responses": {
                    "200": {
                        "description": "Wie er is ingelogd",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Sessie"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "tags": [
                    "Sessie"
                ],
                "summary": "Inloggen",
                "operationId": "postSessie",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "gebruikersnaam",
                                    "wachtwoord"
                                ],
                                "properties": {
                                    "gebruikersnaam": {
                                        "type": "string"
                                    },
                                    "wachtwoord": {
                                        "type": "string",
                                        "format": "password"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Ingelogd",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Sessie"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/Fout"
                    },
                    "401": {
                        "description": "Onjuiste gebruikersnaam of wachtwoord",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Fout"
                                }
                            }
                        }
                    }
                },
                "description": "Direct na installatie, zolang er geen superbeheerder is, logt ook admin/admin in: met `account` null en `installatie` true. Die login kan alleen de eerste superbeheerder maken (`POST /installatie`)."
            },
            "delete": {
                "tags": [
                    "Sessie"
                ],
                "summary": "Uitloggen",
                "description": "Het token werkt daarna niet meer.",
                "operationId": "deleteSessie",
                "security": [
                    {
                        "bearer": []
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Uitgelogd"
                    }
                }
            }
        },
        "/docs": {
            "get": {
                "tags": [
                    "Docs"
                ],
                "summary": "Deze documentatie, in Swagger UI",
                "operationId": "getDocs",
                "responses": {
                    "302": {
                        "description": "Naar de viewer",
                        "headers": {
                            "Location": {
                                "schema": {
                                    "type": "string",
                                    "format": "uri"
                                }
                            }
                        }
                    }
                },
                "description": "Stuurt door naar Swagger UI op petstore.swagger.io, met de url van `/docs/openapi.json` als `?url=`. Deze server heeft zelf geen viewer."
            }
        },
        "/docs/openapi.json": {
            "get": {
                "tags": [
                    "Docs"
                ],
                "summary": "De OpenAPI-spec van deze API",
                "operationId": "getOpenapi",
                "responses": {
                    "200": {
                        "description": "OpenAPI 3.1",
                        "content": {
                            "application/json": []
                        }
                    }
                },
                "description": "Iedereen mag hem lezen, ook vanaf andere sites (CORS `*`)."
            }
        },
        "/docs/schema.json": {
            "get": {
                "tags": [
                    "Docs"
                ],
                "summary": "De typen van deze API als JSON Schema",
                "description": "Dezelfde typen als in deze spec, in een los JSON Schema-bestand (2020-12), om zelf te gebruiken. `$id` is de url van het bestand. Iedereen mag hem lezen, ook vanaf andere sites (CORS `*`).",
                "operationId": "getSchema",
                "responses": {
                    "200": {
                        "description": "JSON Schema",
                        "content": {
                            "application/json": []
                        }
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearer": {
                "type": "http",
                "scheme": "bearer",
                "description": "Het token uit `POST /sessie`"
            }
        },
        "parameters": {
            "GesprekId": {
                "name": "gesprek_id",
                "in": "query",
                "required": true,
                "schema": {
                    "type": "string"
                }
            }
        },
        "responses": {
            "Fout": {
                "description": "Ongeldig verzoek",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Fout"
                        }
                    }
                }
            },
            "NietIngelogd": {
                "description": "Geen of geen geldig token",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Fout"
                        }
                    }
                }
            },
            "NietGevonden": {
                "description": "Gesprek of stelling niet gevonden",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Fout"
                        }
                    }
                }
            },
            "GeenToegang": {
                "description": "Ingelogd, maar dit mag dit account niet",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Fout"
                        }
                    }
                }
            },
            "Conflict": {
                "description": "Kan nu niet, zie de melding (bijvoorbeeld: gebruikersnaam bezet, je eigen status, of het gesprek is gepauzeerd)",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Fout"
                        }
                    }
                }
            }
        },
        "schemas": {
            "Fout": {
                "$ref": "schema.json#/$defs/Fout"
            },
            "Waarde": {
                "$ref": "schema.json#/$defs/Waarde"
            },
            "Moderatie": {
                "$ref": "schema.json#/$defs/Moderatie"
            },
            "Telling": {
                "$ref": "schema.json#/$defs/Telling"
            },
            "Gesprek": {
                "$ref": "schema.json#/$defs/Gesprek"
            },
            "Stelling": {
                "$ref": "schema.json#/$defs/Stelling"
            },
            "Antwoord": {
                "$ref": "schema.json#/$defs/Antwoord"
            },
            "Beoordeling": {
                "$ref": "schema.json#/$defs/Beoordeling"
            },
            "EventType": {
                "$ref": "schema.json#/$defs/EventType"
            },
            "Event": {
                "$ref": "schema.json#/$defs/Event"
            },
            "Deelnemer": {
                "$ref": "schema.json#/$defs/Deelnemer"
            },
            "Export": {
                "$ref": "schema.json#/$defs/Export"
            },
            "Status": {
                "$ref": "schema.json#/$defs/Status"
            },
            "Rol": {
                "$ref": "schema.json#/$defs/Rol"
            },
            "Account": {
                "$ref": "schema.json#/$defs/Account"
            },
            "NieuwAccount": {
                "$ref": "schema.json#/$defs/NieuwAccount"
            },
            "Sessie": {
                "$ref": "schema.json#/$defs/Sessie"
            },
            "Lid": {
                "$ref": "schema.json#/$defs/Lid"
            },
            "Superbeheerder": {
                "$ref": "schema.json#/$defs/Superbeheerder"
            },
            "Statuswijziging": {
                "$ref": "schema.json#/$defs/Statuswijziging"
            },
            "Uitnodiging": {
                "$ref": "schema.json#/$defs/Uitnodiging"
            },
            "Gespreksstatus": {
                "$ref": "schema.json#/$defs/Gespreksstatus"
            }
        }
    }
}